思想: 合并排序算法的分治策略是将待排序元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。
1 #include <stdio.h> 2 3 void merge(int a[],int p,int q,int r) 4 { 5 int n1=q-p+1,n2=r-q; 6 int b1[n1]; 7 int b2[n2]; 8 int i=0,j=0,temp1=p,temp2=q; 9 while(p<=q) 10 { 11 b1[i]=a[p]; 12 ++i; 13 ++p; 14 } 15 while(q+1<=r) 16 { 17 b2[j]=a[q+1]; 18 ++j; 19 ++q; 20 } 21 22 p=temp1;q=temp2; 23 i=0,j=0; 24 while(p<=r) 25 { 26 if(i==n1) 27 { 28 a[p]=b2[j]; 29 ++j; 30 } 31 else if(j==n2) 32 { 33 a[p]=b1[i]; 34 ++i; 35 } 36 37 else if(b1[i]<b2[j]) 38 { 39 a[p]=b1[i]; 40 ++i; 41 } 42 else 43 { 44 a[p]=b2[j]; 45 ++j; 46 } 47 ++p; 48 } 49 } 50 51 void merge_sort(int a[],int p,int r) 52 { 53 int q=0; 54 if(p<r) 55 { 56 q=(p+r)/2; 57 merge_sort(a,p,q); 58 merge_sort(a,q+1,r); 59 merge(a,p,q,r); 60 } 61 } 62 63 int main() 64 { 65 int i, a[100]; 66 srand(time(0)); 67 for ( i = 1; i < 101; ++i ){ 68 a[i-1] = rand() % 1001; 69 printf( "%3d ", a[i-1] ); 70 if(i%15==0) printf("\n"); 71 } 72 printf("\n\n"); 73 SelectionSort(a, 100); 74 for ( i = 1; i < 101; ++i ){ 75 printf( "%3d ", a[i-1] ); 76 if(i%15==0) printf("\n"); 77 } 78 getch(); 79 return 0; 80 }