生成一组随机数,文件名为:4-1 CreateData.c #include <stdlib.h> int CreateData(int arr[],int n,int min,int max) //创建一个随机数组,a保存生成的数据,n为数组元素的数量 { int i,j,flag; srand(time(NULL)); if((max-min+1)<n) return 0; //最大数与最小数之差小于产生数组的数量,生成数据不成功 for(i=0;i<n;i++) { do { arr[i]=(max-min+1)*rand()/(RAND_MAX+1)+min; flag=0; for(j=0;j<i;j++) { if(arr[i]==arr[j]) flag=1; } }while(flag); } return 1; } 冒泡排序的实现: #include <stdio.h> #include "4-1 CreateData.c" #define ARRAYLEN 6 void BubbleSort(int a[],int n) { int i,j,t; for(i=0;i<n-1;i++) { for(j=n-1;j>i;j--) { if(a[j-1]>a[j]) { t=a[j-1]; a[j-1]=a[j]; a[j]=t; } } printf("第%2d遍:",i+1); for(j=0;j<n;j++) printf("%d ",a[j]); printf("/n"); } } void BubbleSort1(int a[],int n) { int i,j,t,flag=0; //flag用来标记是否发生交换 for(i=0;i<n-1;i++) { for(j=n-1;j>i;j--) { if(a[j-1]>a[j])//交换数据 { t=a[j-1]; a[j-1]=a[j]; a[j]=t; flag=1; } } printf("第%2d遍:",i+1); for(j=0;j<n;j++) printf("%d ",a[j]); printf("/n"); if(flag==0) //没发生交换,直接跳出循环 break; else flag=0; } } int main() { int i,a[ARRAYLEN]; for(i=0;i<ARRAYLEN;i++) a[i]=0; if(!CreateData(a,ARRAYLEN,1,100)) { printf("生成随机数不成功!/n"); getch(); return 1; } printf("原数据:"); for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("/n"); BubbleSort1(a,ARRAYLEN); printf("排序后:"); for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("/n"); return 0; } 选择排序的实现: #include <stdio.h> #include "4-1 CreateData.c" #define ARRAYLEN 10 void SelectSort(int a[],int n) { int i,j,t,k; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(a[k]>a[j]) k=j; t=a[i]; a[i]=a[k]; a[k]=t; } } int main() { int i,a[ARRAYLEN]; for(i=0;i<ARRAYLEN;i++) a[i]=0; if(!CreateData(a,ARRAYLEN,1,100)) { printf("生成随机数不成功!/n"); getch(); return 1; } printf("原数据:"); for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("/n"); SelectSort(a,ARRAYLEN); printf("排序后:"); for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("/n"); getch(); return 0; } 插入排序的实现: #include <stdio.h> #include "4-1 CreateData.c" //生成随机数的函数 #define ARRAYLEN 10 //需要排序的数据元素数量 void InserSort(int a[],int n)//直接插入排序 { int i,j,t; for(i=1;i<n;i++) { t=a[i]; //取出一个未排序的数据 for(j=i-1;j>=0 && t<a[j];--j) //在排序序列中查找位置 a[j+1]=a[j]; //向后移动数据 a[j+1]=t; //插入数据到序列 } } int main() { int i,a[ARRAYLEN]; //定义数组 for(i=0;i<ARRAYLEN;i++) //清空数组 a[i]=0; if(!CreateData(a,ARRAYLEN,1,100)) //判断生成随机数是否成功 { printf("生成随机数不成功!/n"); getch(); return 1; } printf("原数据:"); //输出生成的随机数 for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("/n"); InserSort(a,ARRAYLEN); //调用插入排序函数 printf("排序后:"); for(i=0;i<ARRAYLEN;i++) //输出排序后的结果 printf("%d ",a[i]); printf("/n"); getch(); return 0; } 希尔排序 #include <stdio.h> #include "4-1 CreateData.c" //生成随机数的函数 #define ARRAYLEN 10 //需要排序的数据元素数量 void ShellSort(int a[],int n)//希尔排序 { int d,i,j,x; d=n/2; while(d>=1) //循环至增量为1时结束 { for(i=d;i<n;i++) { x=a[i]; //获取序列中的下一个数据 j=i-d; //序列中前一个数据的序号 while(j>=0 && a[j]>x) //下一个数大于前一个数 { a[j+d]=a[j]; //将后一个数向前移动 j=j-d; //修改序号,继续向前比较 } a[j+d]=x; //保存数据 } d/=2; //缩小增量 } } int main() { int i,a[ARRAYLEN]; //定义数组 for(i=0;i<ARRAYLEN;i++) //清空数组 a[i]=0; if(!CreateData(a,ARRAYLEN,1,100)) //判断生成随机数是否成功 { printf("生成随机数不成功!/n"); getch(); return 1; } printf("原数据:"); //输出生成的随机数 for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("/n"); ShellSort(a,ARRAYLEN); //调用希尔排序函数 printf("排序后:"); for(i=0;i<ARRAYLEN;i++) //输出排序后的结果 printf("%d ",a[i]); printf("/n"); getch(); return 0; } 快速排序: #include <stdio.h> #include "4-1 CreateData.c" #define ARRAYLEN 10 int Division(int a[],int left, int right) //分割 { int base=a[left]; //基准元素 while(left<right) { while(left<right && a[right]>base) --right; //从右向左找第一个比基准小的元素 a[left]=a[right]; while(left<right && a[left]<base ) ++left; //从左向右找第一个比基准大的元素 a[right]=a[left]; } a[left]=base; return left; } void QuickSort(int a[],int left,int right) { int i,j; if(left<right) { i=Division(a,left,right); //分割 QuickSort(a,left,i-1); //将两部分分别排序 QuickSort(a,i+1,right); } } int main() { int i,a[ARRAYLEN]; for(i=0;i<ARRAYLEN;i++) a[i]=0; if(!CreateData(a,ARRAYLEN,1,100)) { printf("生成随机数不成功!/n"); getch(); return 1; } printf("原数据:"); for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("/n"); QuickSort(a,0,ARRAYLEN-1); printf("排序后:"); for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("/n"); getch(); return 0; } 堆排序: #include <stdio.h> #include "4-1 CreateData.c" #define ARRAYLEN 10 void HeapAdjust(int a[],int s,int n)//构成堆 { int j,t; while(2*s+1<n) //第s个结点有右子树 { j=2*s+1 ; if((j+1)<n) { if(a[j]<a[j+1])//右左子树小于右子树,则需要比较右子树 j++; //序号增加1,指向右子树 } if(a[s]<a[j])//比较s与j为序号的数据 { t=a[s]; //交换数据 a[s]=a[j]; a[j]=t; s=j ;//堆被破坏,需要重新调整 } else //比较左右孩子均大则堆未破坏,不再需要调整 break; } } void HeapSort(int a[],int n)//堆排序 { int t,i; int j; for(i=n/2-1;i>=0;i--) //将a[0,n-1]建成大根堆 HeapAdjust(a, i, n); for(i=n-1;i>0;i--) { t=a[0];//与第i个记录交换 a[0] =a[i]; a[i] =t; HeapAdjust(a,0,i); //将a[0]至a[i]重新调整为堆 } } int main() { int i,a[ARRAYLEN]; for(i=0;i<ARRAYLEN;i++) a[i]=0; if(!CreateData(a,ARRAYLEN,1,100)) { printf("生成随机数不成功!/n"); getch(); return 1; } printf("原数据:"); for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("/n"); HeapSort(a,ARRAYLEN); printf("排序后:"); for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("/n"); getch(); return 0; } 合并排序: #include <stdio.h> #include "4-1 CreateData.c" //生成随机数的函数 #define ARRAYLEN 10 //需要排序的数据元素数量 void MergeStep(int a[],int r[],int s,int m,int n) //相邻有序段合并 { int i,j,k; k=s; i=s; j=m+1; while(i<=m && j<=n) //当两个有序表都未结束时,循环比较 { if(a[i]<=a[j]) //当较小的元素复制到R中 r[k++]=a[i++]; else r[k++]=a[j++]; } while(i<=m) //将未合并的部分复制到R中 r[k++]=a[i++]; while(j<=n) r[k++]=a[j++]; //将未合并的部分复制到R中 } void MergePass(int a[],int r[],int n,int len) //完成一遍合并的函数 { int s,e; s=0; while(s+len<n) //至少有两个有序段 { e=s+2*len-1; if(e>=n) //最后一段可能少于len个结点 e=n-1; MergeStep(a,r,s,s+len-1,e); //相邻有序段合并 s=e+1; //下一对有序段中左段的开始下标 } if(s<n) //还剩一个有序段,将其从A中复制到R中 for(;s<n;s++) r[s]=a[s]; } void MergeSort(int a[],int n) { int *p; int len=1; //有序序列的长度 int f=0; //变量f作标志 if(!(p=(int *)malloc(sizeof(int)*n))) //分配内存空间,保存临时数据 { printf("分配临时内存失败!/n"); exit(0); } while(len<n) { if(f) //交替地在A和P之间来回合并 MergePass(p,a,n,len); //调用MergePass,对p合并到a else MergePass(a,p,n,len); //调用MergePass,对a合并到p len*=2; //增加有序序列长度 f=1-f; //使f值在0和1之间切换 } if(f) //若进行了排序 for(f=0;f<n;f++) //将数组p中的数据复制到数组a a[f]=p[f]; free(p); //释放分配的内存 } int main() { int i,a[ARRAYLEN]; //定义数组 for(i=0;i<ARRAYLEN;i++) //清空数组 a[i]=0; if(!CreateData(a,ARRAYLEN,1,100)) //判断生成随机数是否成功 { printf("生成随机数不成功!/n"); getch(); return 1; } printf("原数据:"); //输出生成的随机数 for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("/n"); MergeSort(a,ARRAYLEN); //调用合并排序函数 printf("排序后:"); for(i=0;i<ARRAYLEN;i++) //输出排序后的结果 printf("%d ",a[i]); printf("/n"); getch(); return 0; } 摘自《零基础学算法》,非常好的一本书