[原创]C语言排序算法大全,大家进来支持一下
程序代码:一.冒泡法:
此法是最常用的一种方法,其思维比较简单,有两种冒泡法,一种是大数逐渐上浮到最后面,还有一种就是小的数依次浮到最前面,关于冒泡法上海大学教材上有详细说明,本人不多做解释,主要对代码进行一些解析。
法一:
#define N 10//宏定义命令,N代表10
#include<stdio.h>
main()
{
int a[N],i,j,t;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N-1;i++)//外循环控制次数,表示要执行N-1次冒泡
for(j=0;j<N-1-i;j++)//从前往后,每比较一次后大的数
if(a[j]>a[j+1])//就到了前后面
{t=a[j];a[j]=a[j+1];a[j+1]=t;}
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
}
法二:
#define N 10
#include<stdio.h>
main()
{
int a[N],i,j,t;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N-1;i++)//外循环控制次数
for(j=N-1;j>i;j--)//从后向前,每比较一次小的数就到了
if(a[j]<a[j-1])//前面
{t=a[j];a[j]=a[j-1];a[j-1]=t;}
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
}
二.选择法:
选择法的思路也比较简单,学校书上没说清楚,现在我说清楚一下,就是先找出最小数,然后将其与第一个数调换,再在第二个人数开始的数列中找出最小数,与第二个数调换,依次类推,本人就说这么多了,大家请自己体会。
法一:
/*此法代码比较简单,容易理解,推荐大家用这种方法*/
#define N 10
#include<stdio.h>
main()
{
int a[N],i,j,t;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if(a[i]>a[j])//每当遇到a[i]比a[j]大时,都进行交换
{t=a[i];a[i]=a[j];a[j]=t;}
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
}
法二:
#define N 10
#include<stdio.h>
main()
{
int a[N],i,j,min,t;
scanf("%d",&a[i]);
for(i=0;i<N-1;i++)
{
for(min=i,j=i+1;j<N;j++)//找出最小值所在下标
if(a[min]>a[j]) min=j;
if(min!=i)//这里是程序优化部分,也可不要
{t=a[min];a[min]=a[i];a[i]=t;}
}
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
}
法三(构造函数):
(一学弟曾这样做过,叫我帮他排错,我帮他找出了错误,同时进一步优化程序,使程序的可读性尽量好,算法的时间复杂度尽量低,不过不推荐大家这样做)
#define N 10
#include<stdio.h>
int min(int a[],int i)
{
int j,min;
for(min=i,j=i+1;j<N;j++)
if(a[min]>a[j]) min=j;
return min;
}
main()
{
int a[N],i,t,min1;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N-1;i++)
{
min1=min(a,i);
if(min1!=i)
{t=a[min1];a[min1]=a[i];a[i]=t;}
}
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
}
三.插入法:
插入法是这三种方法中最难得,一般用的较少,不推荐大家这样做,其基本思路是这样的,在之前已经排序好的数列中插入一个数,使其仍然有续,逐个进行下去,就可完成排序。
法一:
#define N 10
#include<stdio.h>
main()
{
int a[N],i,j,t;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=1;i<N;i++)
{ /*t保存a[i]的值*/
for(t=a[i],j=i-1;j>=0;j--)//从后向前依次对比a[i]和
if(t<a[j]) a[j+1]=a[j];//a[j]值,若a[i]<a[j],
else break; //则后移一位,若不成立,即找到了
a[j+1]=t;//插入位置,这一句就是插入过程
}
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
}
法二:
这个是本人自己的方法,和教材上的有点不一样,教材上是在寻找插入位置的过程中逐个后移数组,我这个是先找到插入点,然后整体后移数组。
#define N 10
#include<stdio.h>
main()
{
int a[N],i,j,k,t;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=1;i<N;i++)
for(j=0;j<N-1;j++)
if(a[i]<a[j])//找到了插入位置
{
for(t=a[i],k=i;k>j;k--)//此循环为数组
a[k]=a[k-1];//后移过程,不做详细分析
a[j]=t;//将a[i]插入指定位置
break;
}
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
}
/*本人语言表达水平不够,也只能够做这些分析,大家应该记得一道题——对于一个有序数列,插入一个数后,使其仍然有续。会做这道题了插入法也就不难理解了*/







