1. 程式人生 > >排序——合並(歸並)排序

排序——合並(歸並)排序

有序 pre sort left blog 只有一個 當前 code 兩個

原理圖:

技術分享

實現代碼:

#define MAX 1000

//合並區間a[left,middel]和a[middle+1,right]
void Merge(int a[],int left,int middle,int right)
{
    int pleft=left;  //給左右區間分別加上遊標
    int pright=middle+1;
    int b[MAX];
    int pb=0;
    while(pleft<=middle && pright<=right)//任何一個區間全部合並,結束循環
    {
        if(a[pleft]<=a[pright])
        {
            b[pb
++] = a[pleft++]; //將a[pright]添加到數組b,並移動pright至下一個位置 } else //a[pleft] > a[pright] { b[pb++] = a[pright++]; } } while(pleft<=middle) { b[pb++] = a[pleft++]; } while(pright<=right) { b[pb++] = a[pright++]; }
//再將合並成的數組b重新拷回給a int i,j; for(i=0,j=left;i<pb;i++,j++) { a[j] = b[i]; } } //將數組a[left,right]分成兩個區間分別排序,然後合並 void MergeSort(int a[],int left,int right) { int middle; if(left<right) //如果當前子區間只有一個元素就不再繼續劃分子區間了,這時MergeSort()會被跳過,直接執行Merge合並 { middle = (left+right)/2
; MergeSort(a,left,middle); //對左區間進行排序 MergeSort(a,middle+1,right); //對右區間進行排序 Merge(a,left,middle,right); //合並線性表的原理,合並兩個有序的區間 } }

排序——合並(歸並)排序