歸併排序大致上可以理解爲把所有數拆分到最小單位,在每個小單位時進行排序,依次把這個小單位變大,然後再排序。一直到所有數。
上圖中SR爲函數形參時傳入的數組,TR爲臨時數組。在本代碼中,num數組爲傳入數組,t爲臨時數組。left在最左邊,mid爲上圖的m,right在最右邊。
1 #include<stdio.h> 2 3 void Merge(int num[],int t[],int left,int mid,int right){ 4 5 int i = left; //i在左邊 6 int j = mid + 1; //j在右邊,對應上圖 7 int k = i; 8 9 for(;i<=mid && j<=right;k++){ //i、j都是有界限的,k是臨時數組存入的下標 10 11 if(num[i]<num[j]){ //找出較小的數依次存放到臨時數組t中 12 t[k] = num[i]; //num[i]小就把這個數存入 13 i++; //然後在左邊找下一個 14 } 15 else{ 16 t[k] = num[j]; //num[j]小就把這個數存入 17 j++; //然後在右邊找下一個 18 } 19 } 20 21 int l; 22 if(i<=mid) //當j全部存入後就把剩餘的i部分也全存入 23 for(l=0;l<=mid-i;l++) 24 t[k+l] = num[i+l]; 25 if(j<=right) //當i全部存入後就把剩餘的j部分也全存入 26 for(l=0;l<=right-j;l++) 27 t[k+l] = num[j+l]; 28 29 } 30 31 void MSort(int num[],int t[],int left,int right) { //t是存儲排好序的數組 32 33 int t2[7]; //每次分半後到最小單位數存放在臨時數組t2中 34 int m = (left+right)/2; 35 36 if(left==right) 37 t[m] = num[left]; //如果left、riht相同,則把這個位置上的數存放到臨時數組 38 else{ //相同位置上 ,其實就是找到最小單位存入(拆分到1個) 39 MSort(num,t2,left,m); //如果不同,則分半遞歸繼續尋找 40 MSort(num,t2,m+1,right); 41 Merge(t2,t,left,m,right); //當t2存放新數之後,就開始排序 42 } 43 44 45 } 46 47 void main(){ 48 49 int i,num[7] = {12,13,0,21,10,5,7},t[7]; 50 for(i=0;i<7;i++) 51 printf("%d ",num[i]); 52 53 printf("\n"); 54 MSort(num,t,0,6); 55 56 for(i=0;i<7;i++) 57 printf("%d ",t[i]); 58 59 60 }