1. 程式人生 > 實用技巧 >淺談歸併排序

淺談歸併排序

歸併排序應該說是算得上一個非常優秀的演算法。因為,到後面學習資料結構的時候你可以發現,很多的資料結構題無不用到了歸併排序的思想,有一點像堆排序,同快速排序不一樣,他們都不是線性排序。

下面放一張圖,大家可以大概感受一下歸併排序的過程是怎麼樣的。

其實我們只需要分到最小的,然後在遞歸回來就可以實現該操作了,具體程式碼如下:

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); //再將二個有序數列合併  
    }  
}  

合併的操作也是非常的簡單的,只是需要一點小小的腦補,就是我們把兩個要合併的內容進行逐個對比,小的先合併進去,大的後合併,然後依次填滿就可以了。這是在回溯的過程中執行的(mergearrey)下面放一篇截過的程式碼:

void mergearray(int a[], int first, int mid, int last, int temp[])  
{  
    int i = first, j = mid + 1;  
    int m = mid,   n = last;  
    int k = 0;  

    while (i <= m && j <= n)  
    {  
        if (a[i] <= a[j])  
            temp[k++] = a[i++];  
        else  
            temp[k++] = a[j++];  
    }  

    while (i <= m)  
        temp[k++] = a[i++];  

    while (j <= n)  
        temp[k++] = a[j++];  

    for (i = 0; i < k; i++)  
        a[first + i] = temp[i];  
}  

然後大家應該就學會了吧!!!我也告辭了!

謝謝採納!!!