重溫經典演算法之一 歸併排序

2022-07-09 21:36:09 字數 1539 閱讀 8917

歸併排序的基本思想是分治法,先將要排序的陣列從中間分成兩個小的陣列,然後分別排序這兩個小的陣列,最後將這兩個小的已經排序的陣列合併成乙個有序的陣列。所以歸併排序的基本框架為:

1

mergesort(array, start, end)

210 }

有了上面的框架,歸併排序就轉換為將兩個已經排序的陣列合併為乙個大的排序陣列問題。這個非常簡單,只要先比較二個陣列的第乙個數,誰小就先取誰,取了後就在對應陣列中刪除這個數。然後再進行比較,如果有陣列為空,那直接將另乙個陣列的資料依次取出即可。

1

void mergearray(int data, int start, int mid, int end, int

temp)2

12while (i <=mid)

13 temp[k++] = data[i++];

14while (j <=end)

15 temp[k++] = data[j++];

16for (k = start; k <= end; k++)

17 data[k] =temp[k];

18 }

歸併排序的效率是比較高的,設數列長為n

,將數列分開成小數列一共要

logn

步,每步都是乙個合併有序數列的過程,時間複雜度可以記為

o(n)

,故一共為

o(n*logn)

。因為歸併排序每次都是在相鄰的資料中進行操作,所以歸併排序在複雜度為o(n*logn)的幾種排序方法(快速排序,歸併排序,希爾排序,堆排序)中效率算是比較高的。

1

void mergearray(int data, int start, int mid, int end, int

temp)2

12while (i <=mid)

13 temp[k++] = data[i++];

14while (j <=end)

15 temp[k++] = data[j++];

16for (k = start; k <= end; k++)

17 data[k] =temp[k];18}

19void mergesortrecursively(int data, int start, int end, int

temp)

2029

void mergesort(int data, int

n)30

view code

下面是我在自己電腦上測試了下歸併排序和qsort排序的效率:

對20000個隨機資料進行測試:

對200000個隨機資料進行測試:

歸併排序(重溫經典演算法系列)

單個元素肯定有序 歸併排序採用分治思想,分而治之 將待排序陣列劃分為n等分,每份長度為1個元素,則 n份全部有序 再一生二,二生四,逐步兩兩元素有序的區間,歸一合併成1個有序區間 最終會歸併出整乙個陣列元素有序的結果.歸併排序有兩種實現方式 1 自頂向下遞迴呼叫實現 2 自底向上迭代執行實現.左右雙...

經典演算法 歸併排序

題目說明 歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法也是採用分治法 divide and conquer 的乙個非常典型的應用。演算法複雜度為o n logn 題目解析 歸併排序是利用遞迴和分而治之的技術將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半...

經典排序演算法之 歸併排序

1 思想 多次將兩個或兩個以上的有序表合併成乙個新的有序表。2 演算法時間複雜度 最好的情況下 一趟歸併需要n次,總共需要logn次,因此為o n logn 最壞的情況下,接近於平均情況下,為o n logn 說明 對長度為n的檔案,需進行logn 趟二路歸併,每趟歸併的時間為o n 故其時間複雜度...