將包含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...