4-8 MergeSort.c
1 #include <stdio.h> 2 #include "4-1 CreateData.c" //生成随机数的函数 3 #define ARRAYLEN 10 //需要排序的数据元素数量 4 void MergeStep(int a[],int r[],int s,int m,int n) //相邻有序段合并 5 { 6 int i,j,k; 7 k=s; 8 i=s; 9 j=m+1; 10 while(i<=m && j<=n) //当两个有序表都未结束时,循环比较 11 { 12 if(a[i]<=a[j]) //当较小的元素复制到R中 13 r[k++]=a[i++]; 14 else 15 r[k++]=a[j++]; 16 } 17 while(i<=m) //将未合并的部分复制到R中 18 r[k++]=a[i++]; 19 while(j<=n) 20 r[k++]=a[j++]; //将未合并的部分复制到R中 21 } 22 void MergePass(int a[],int r[],int n,int len) //完成一遍合并的函数 23 { 24 int s,e; 25 s=0; 26 while(s+len<n) //至少有两个有序段 27 { 28 e=s+2*len-1; 29 if(e>=n) //最后一段可能少于len个结点 30 e=n-1; 31 MergeStep(a,r,s,s+len-1,e); //相邻有序段合并 32 s=e+1; //下一对有序段中左段的开始下标 33 } 34 if(s<n) //还剩一个有序段,将其从A中复制到R中 35 for(;s<n;s++) 36 r[s]=a[s]; 37 } 38 void MergeSort(int a[],int n) 39 { 40 int *p; 41 int len=1; //有序序列的长度 42 int f=0; //变量f作标志 43 if(!(p=(int *)malloc(sizeof(int)*n))) //分配内存空间,保存临时数据 44 { 45 printf("分配临时内存失败!\n"); 46 exit(0); 47 } 48 while(len<n) 49 { 50 if(f) //交替地在A和P之间来回合并 51 MergePass(p,a,n,len); //调用MergePass,对p合并到a 52 else 53 MergePass(a,p,n,len); //调用MergePass,对a合并到p 54 len*=2; //增加有序序列长度 55 f=1-f; //使f值在0和1之间切换 56 } 57 if(f) //若进行了排序 58 for(f=0;f<n;f++) //将数组p中的数据复制到数组a 59 a[f]=p[f]; 60 free(p); //释放分配的内存 61 } 62 63 int main() 64 { 65 int i,a[ARRAYLEN]; //定义数组 66 for(i=0;i<ARRAYLEN;i++) //清空数组 67 a[i]=0; 68 if(!CreateData(a,ARRAYLEN,1,100)) //判断生成随机数是否成功 69 { 70 printf("生成随机数不成功!\n"); 71 getch(); 72 return 1; 73 } 74 printf("原数据:"); //输出生成的随机数 75 for(i=0;i<ARRAYLEN;i++) 76 printf("%d ",a[i]); 77 printf("\n"); 78 MergeSort(a,ARRAYLEN); //调用合并排序函数 79 printf("排序后:"); 80 for(i=0;i<ARRAYLEN;i++) //输出排序后的结果 81 printf("%d ",a[i]); 82 printf("\n"); 83 getch(); 84 return 0; 85 }
时间: 2024-10-26 15:17:06