歸併排序與前面介紹過的基於交換、選擇等排序的思想不一樣,「歸併」的含義是將兩個或兩個以上的有序表組合成乙個新的有序表。假定待排序表含有n個記錄,則可以看成是n個有序的子表,每個子表長度為1,然後兩兩歸併,得到[n/2]個長度為2或1的有序表;再兩兩歸併,……如此重複,直到合併成乙個長度為n的有序表為止,這種排序方法稱為2-路歸併排序。下面給出乙個2路歸併排序的乙個例子:
merge()的功能是將前後相鄰的兩個有序表歸併為乙個有序表的演算法。設兩段有序表a[low…mid]、a[mid+1…high]存放在同乙個順序表中相鄰的位置上,先將它們複製到輔助陣列b中。每次從對應b中的兩個段取出乙個記錄進行關鍵字的比較,將較小者放入a中,當陣列b中有一段的下標超出其對應的表長時(即該段的所有元素已經完全複製到a中),將另一段中剩餘部分直接複製到a中,下面給出其演算法:
elemtype *b=[elemtype*]malloc((n+1)*sizeof(elemtype));//輔助陣列b
void merge(elemtype a,int low,int mid,int high)
while(i<=mid) a[k++]=b[j++];//若第乙個表沒有檢測完,複製
while(j<=high) a[k++]=b[j++];//若第二個表沒有檢測完,複製
}
一趟歸併排序的操作是,呼叫[n/2h]次演算法merge()將l[1…n]中前後相鄰且長度為h的有序段進行兩兩歸併,得到前後相鄰、長度為2h的有序段,整個歸併排序需要進行[log₂n]趟。
遞迴形式的2-路歸併排序演算法是基於分治的,其過程如下:
分解:將含有n個元素的待排序表分成各含n/2個元素的子表,採用2-路歸併排序演算法對兩個子表遞迴地進行排序。
合併:合併兩個已排序的子表得到排序結果。
void mergesort(elemtype a,int low,int high)
}
空間複雜度:merge()操作中,輔助空間剛好要占用n個單元,所有歸併排序的空間複雜度為o(n)。
時間複雜度:每一趟歸併的時間複雜度為o(n),共需要進行log₂n趟歸併,所以演算法的時間複雜度為o(nlog₂n)。
穩定性:由於merge()操作不會改變相同關鍵字的相對次序,所以2-路歸併排序演算法是乙個穩定的排序演算法。
資料結構 歸併排序
排序 sort 或分類 內部排序方法可以分為五類 插入排序 選擇排序 交換排序 歸併排序和分配排序。歸併排序 include using namespace std 歸併排序中的合併演算法 void merge int a,int left,int center,int len int t int ...
資料結構 歸併排序
歸併排序,即merge sort,通過遞迴式的merge操作 merge即歸併 實現排序。演算法思想是分治思想 divide and conquer 歸併排序一般是遞迴實現的 時間複雜度o nlgn 遞迴都是一去一回,去的時候divide,回的時候conquer。表達欠提煉 1 divide,分 遞...
資料結構 歸併排序!!!
歸併排序 整體思想 將資料分成很多的部分,每次排序資料的一部分,然後將兩部分的資料進行整體排序,這樣一步一步將整體資料排序。如圖 注 將需要排序的資料進行分塊,當每個塊的資料足夠的少的時候就可以進行效率高的排序方法,當兩塊資料排序好的時候就可以將兩塊排序好的資料進行合併。具體實現方法 ifndef ...