![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdlib.h> 2 #include<stdio.h> 3 void Merge( int source[] , int temp[] , int start , int mid , int end ) 4 { 5 int i = start , j = mid + 1 , k = start ; 6 while ( i != mid + 1 && j != end + 1 ) 7 { 8 if( source[i] > source[j] ) 9 temp[k++] = source[i++]; 10 else 11 temp[k++] = source[j++]; 12 } 13 while( i != mid + 1 ) 14 temp[k++] = source[i++]; 15 while( j != end + 1 ) 16 temp[k++] = source[j++]; 17 for( i = start ; i <= end ; i++ ) 18 source[i] = temp[i]; 19 } //ÄÚ²¿Ê¹Óõݹé 20 void MergeSort( int source[] , int temp[] , int start , int end ) 21 { 22 int mid; 23 if( start < end ) 24 { 25 mid = ( start + end ) / 2 ; 26 MergeSort( source , temp , start , mid ); 27 MergeSort( source , temp , mid+1 , end ); 28 Merge( source , temp , start , mid , end ); 29 } 30 } 31 int main() 32 { 33 int a[]={18,78,244,36,9,12,4,5,68,7,4,895,321,50,10,30,98,74,56,13,25,46,789,420,159,360,5648,78,1,2,3,6,98}; 34 int i,b[1000]; 35 MergeSort( a , b , 0 , sizeof(a)/sizeof(a[0])-1 ); 36 for( i = 0 ; i < sizeof(a)/sizeof(a[0]) ; i++ ) 37 printf( "%d " , a[i] ); 38 printf(" "); 39 return 0; 40 }
下面这种是总的写法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<string.h> 3 void Merge_Sort( int *a , int l , int r ) 4 { 5 int len = r - l ; 6 if( len <= 1 ) return; 7 int mid = l + len/2 ; 8 Merge_Sort( a , l , mid ) ; 9 Merge_Sort(a , mid, r); 10 int p1 = l,p2 = mid; 11 int temp[10000]; 12 for(int i = l ; i < r ; i++ ) 13 { 14 if( p1 == mid) 15 { 16 temp[i] = a[p2]; 17 p2++; 18 } 19 else if( p2 == r) 20 { 21 temp[i] = a[p1]; 22 p1++; 23 } 24 else 25 { 26 if( a[p1] < a[p2] ) 27 { 28 temp[i] = a[p1]; 29 p1++; 30 } 31 else 32 { 33 temp[i] = a[p2]; 34 p2++; 35 } 36 } 37 } 38 for(int i = l ; i < r ; i++ ) 39 a[i] = temp[i]; 40 } 41 42 int main() 43 { 44 int n,i; 45 int a[] ={10,45,32,69,52,10,58,15}; 46 47 Merge_Sort( a , 1 , sizeof(a)/sizeof(int) ); 48 for( i = 1 ; i < sizeof(a)/sizeof(int) ; i++ ) 49 printf("%d ",a[i]); 50 return 0; 51 }