[原创]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"); } /*本人语言表达水平不够,也只能够做这些分析,大家应该记得一道题——对于一个有序数列,插入一个数后,使其仍然有续。会做这道题了插入法也就不难理解了*/