排序算法——歸併排序

算法思想

歸併排序的主要思想就是將一個待排序列,①不斷地一分爲二劃分紅一個元素組成序列,一個元素組成的序列也就是有序序列,②而後再合併將相鄰的兩個有序序列,最終待排序列變成一個有序序列。
總之,歸併算法就是採用了分治+遞歸的思想,先遞歸分解數列,而後再合併數列算法

算法演示

以待排序列3,2,5,6,4,7,1爲例數組

將此序列一分爲二

①:3,2,56,4,7,1
而後將①左邊序列3,2,5一分爲二3d

②:3 和 2,5
繼續劃分②左邊序列,由於只有一個元素3,因此3已是有序序列,返回到②將右邊序列一分爲二code

③:2 和 5

由於③的左邊和右邊序列均只有一個元素因此都是有序序列,就能夠進行左右相鄰序列的合併操做,此時合併後的序列爲2,5。而後,返回到②合併序列32,5爲有序序列2,3,5blog

而後返回到①,將①右邊的序列一分爲二排序

④:6,4 和 7,1

將④的左邊繼續一分爲二遞歸

⑤:6 和 4

由於⑤的左右兩邊序列均爲一個元素,也就是都是有序的,那麼就將這兩個相鄰序列進行合併,合併後的序列爲4,6,返回到④,將④右邊的序列進行一分爲二ast

⑥:7 和 1

由於⑥的左右兩邊序列均爲一個元素,因此都是有序序列,將這兩個序列合併,合併後爲1,7
而後回到④,合併④的左右兩邊有序序列4,61,7,合併後爲1,4,6,7class

最後回到①,如今①的左右兩邊均爲有序序列,2,3,5 1,4,6,7,合併這兩個序列,合併後就爲1,2,3,4,5,6,7 im

對應上述文字分析,附圖一張,可對照理解

算法代碼實現

根據描述,將代碼實現就可分爲如下兩部分:

遞歸分解序列

//要從新開闢空間存儲排好序的數據
bool MergeSort(int a[],int n)
{
    int * temp = new int[n];
    if(NULL == temp)
        return false;
    mergesort(a,0,n-1,temp);
    delete[] temp;
    return true;
}

void mergesort(int a[],int first,int last,int temp[])
{
    if(first<last)
    {
        int mid = (first+last)/2;//將一個數組一分爲二
        mergesort(a,first,mid,temp);//左邊有序
        mergesort(a,mid+1,last,temp);//右邊有序
        mergearray(a,first,mid,last,temp);//合併兩個數組
    }
}

合併兩個有序序列

//將一個數組一分爲二看作兩個數組,將有二個有序數列a[first...mid]和a[mid...last]合併。
void mergearray(int a[],int first,int mid,int last,int temp[])
{
    int i = first,j = mid+1;
    int n = mid, m = last;
    int k = 0;
    while(i<=n && j<=m)
    {
        if(a[i]<a[j])
            temp[k++] = a[i++];
        else
            temp[k++] = a[j++];
    }
    while(i <= n)
        temp[k++] = a[i++];
        
    while(j <= m)
        temp[k++] = a[j++];
        
    for(i=0;i<k;i++)//將排好序的值賦給原數組
        a[first+i] = temp[i];
}
相關文章
相關標籤/搜索