歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。
歸併排序基本原理:
通過對若干個有序結點序列的歸併來實現排序。
所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。
歸併排序基本思想:
設兩個有序的子串行(相當於輸入序列)放在同一序列中相鄰的位置上:array[low..m],array[m + 1..high],先將它們合併到乙個區域性的暫存序列 temp (相當於輸出序列)中,待合併完成後將 temp 複製回 array[low..high]中,從而完成排序。
在具體的合併過程中,設定 i,j 和 p 三個指標,其初值分別指向這三個記錄區的起始位置。合併時依次比較 array[i] 和 array[j] 的關鍵字,取關鍵字較小(或較大)的記錄複製到 temp[p] 中,然後將被複製記錄的指標 i 或 j 加 1,以及指向複製位置的指標 p加 1。重複這一過程直至兩個輸入的子串行有乙個已全部複製完畢(不妨稱其為空),此時將另一非空的子串行中剩餘記錄依次複製到 array 中即可。
若將兩個有序表合併成乙個有序表,稱為
2-路歸併。
#include #include #include void merge(int* array, int* temp, int first, int mid, int last)
else
}for(; first_elm <= mid; ++first_elm, ++i)
for(; second_elm <= last; ++second_elm, ++i)
memcpy(array + first, temp, sizeof(int)*(last - first + 1));
}void mergesort(int* array, int* temp, int first, int last)
}int main()
; int size = sizeof(array);
int* temp = (int*)malloc(sizeof(array));
mergesort(array, temp, 0, 9);
for(i = 0; i < 10; i++)
printf("\n");
free(temp);
return 0;
}
歸併排序時間複雜度為最壞情況下和平均情況下複雜度均為:o(nlogn),所需儲存空間為:o(n)
排序演算法之歸併排序
歸併排序也是經典的使用分治法思想的代表演算法之一。歸併排序的效率很高,而且是一種穩定的排序。其總體的思想思路就是將待排序的元素分成大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排序的子集合合併成排好序的總集合 歸併排序c 實現如下 include void mergesort int arr...
排序演算法之歸併排序
歸併排序,和快排一樣同樣採用了分治的思想,將兩個 或以上 有序表合併成乙個新的有序表。歸併排序步驟如下 把n個記錄看成 n個長度為 1 的有序子表 進行兩兩歸併使記錄關鍵字有序,得到 n 2 個長度為 2 的有序子表 重複第2步直到所有記錄歸併成乙個長度為n的有序表為止。下面是歸併排序演算法的遞迴實...
排序演算法之歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個有序的子串行,再把有序的子串行合併為整體有序序列。歸併排序圖冊 歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。首先考...