歸併排序c

2021-10-05 15:25:29 字數 992 閱讀 4623

自頂向下的歸併排序演算法是典型的「分治」演算法思想的應用:先分別遞迴處理規模更小的子陣列的排序問題,然後再基於已經排好序的子陣列合併成乙個規模更大的排序陣列,一層一層的遞迴總是均衡地「一分為二」進行的

#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 ...