歸併排序

歸併排序大致上可以理解爲把所有數拆分到最小單位,在每個小單位時進行排序,依次把這個小單位變大,然後再排序。一直到所有數。

 

上圖中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 }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章