排序 5 歸併排序

2021-07-23 15:24:02 字數 1295 閱讀 6490

將包含n個元素的初始序列,看成n個有序的子串行,每個序列的長度為1,然後兩兩歸併...直到得到長度為n的有序序列。

遞迴和非遞迴兩種方法

// 5. 歸併排序--遞迴(recursion)

//融合

void merging(int *list1, int list1_size,int* list2,int list2_size)

; int i=0,j=0,k=0;

while (iif (list1_sizeelse

temp[k++]=list2[j++];

}while(iwhile(j//將合併後的陣列放進list1中

for (int n=0;i

} void mergesort(int a,int n) }

時間複雜度為:o(nlogn);

非遞迴—迭代

因為遞迴時,會在成時間和空間上的效能損耗。將遞迴轉化為迭代。

/**

* merge_sort: 非遞迴實現 --迭代

* 非遞迴思想: 將陣列中的相鄰元素兩兩配對。用merge函式將他們排序,

* 構成n/2組長度為2的排序好的子陣列段,然後再將他們排序成長度為4的子陣列段,

* 如此繼續下去,直至整個陣列排好序。

**/#include

#include

#define len 8

// merge_sort(): 非遞迴實現-自底向上

// 將原陣列劃分為left[min...max] 和 right[min...max]兩部分

void merge_sort(int *list, int length)

for (i = 1; i < length; i *= 2) // i為步長,1,2,4,8……

}free(tmp);

}int main(void)

; merge_sort(a, len);

// print array

int i;

for (i = 0; i < len; i++)

printf("%d ", a[i]);

system("pause");

return

0;}

執行結果:

時間複雜度為o(n);

排序小結 5 歸併排序

歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low.m r m 1.high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出...

排序演算法 5 歸併排序

歸併排序演算法思路 先將陣列不斷均分成兩堆,直至只有乙個元素,再兩兩進行排序合併。使用了大量了額外陣列空間,但減少了比較次數和寫操作。時間複雜度與空間複雜度將再排序演算法總結裡面討論。下面直接展示演算法 def merge sort nums nums為list型別 分解陣列直至陣列長度小於1 wh...

5 歸併排序(詳細)

目錄 sort類在選擇排序中的約定中 歸併排序的思想是將陣列分成兩部分,分別進行排序,然後歸併起來。歸併方法將陣列中兩個已經排序的部分歸併成乙個。算是乙個輔助方法把,下面不管哪種歸併排序都會用到 public abstract class mergesort comparable extends s...