自頂向下的歸併排序演算法是典型的「分治」演算法思想的應用:先分別遞迴處理規模更小的子陣列的排序問題,然後再基於已經排好序的子陣列合併成乙個規模更大的排序陣列,一層一層的遞迴總是均衡地「一分為二」進行的
#includeusing namespace std;
// 將a[l...mid]和a[mid+1...r]兩部分進行歸併
templatevoid __merge(t a, int left, int mid, int right) else if (j > r) else if(aux[i - 1] < aux[j - 1]) else }}
templatevoid __mergesort(t a, int l, int r)
void merge(t a, int n)
時間複雜度:o(nlogn);
在__mergesort中,如果merge前兩個陣列已經有序,則不需要合併(判斷方法:a[mid] < a[mid + 1])
在__merge 這個方法裡,每執行一次,都要 new 乙個陣列,此時可以在函式 __merge中使用乙個全域性的輔助陣列,避免每次都開闢新的記憶體空間進行比較,這樣做反而程式設計實現更簡單,不用考慮索引的偏移
在歸併的子過程中,如果待排序的陣列元素個數很少的情況下,可以使用插入排序,因為插入排序對於近乎有序的陣列而言,可以提前終止迴圈,從而提高整體排序的效率。
void __mergesort2(t a, int l, int r)
int mid = (l+r)/2;
__mergesort2(arr, l, mid);
__mergesort2(arr, mid+1, r);
if( a[mid] > a[mid+1] )
__merge(arr, l, mid, r);
}
void sort(int a )
}}
link
c 歸併排序
1.需求 將乙個陣列通過歸併排序排成有序陣列 2.思想 歸併排序是分治法的乙個典型應用,將兩個有序的序列合併成乙個有序的序列稱為歸併,歸併排序,通過將陣列分成若干個有序的序列,當拆分成只有乙個數時認為是有序的,然後將這些序列歸併。這裡需要用到遞迴。3.實現 public class msort 歸併...
C 歸併排序
include using namespace std void mergesort int array,int start,int end 若某乙個子陣列的元素沒有取完,則全部並於臨時空間 while left idxarray left idx while right idxarray righ...
C 歸併排序
歸併排序 merge sort 是利用歸併的思想實現的排序方法,該演算法採用經典的分治 divide and conquer 策略將問題分成一些小的問題然後遞迴求解,即分而治之。遞迴 includeusing namespace std void merge int arr,int low,int ...