排序思路:
分治:將長度為len的陣列array分為[0, len/2],[len/2+1, len-1],直到無法繼續劃分為止。
合併:將子陣列逐級合併,合併過程中進行排序——申請與len相當大小的空間tmp,比較當前要合併的2個陣列的元素,從小到大,排入到tmp。排序好的tmp複寫array對應的索引位置。
舉例:
1)分治
2)排序
3)合併
4)合併
總結:分治後的陣列從最底層開始排序,每排好一層,上移一層繼續排序。降低了上層排序的比較次數,歸併排序是穩定的排序演算法。
|
| -->>逐層拆分過程
| | | -->>逐層排序過程
|
c實現
/*
* 合併子陣列並進行排序
*/void merge(int
array, int tmp, int start, int mid, int end)
while(i1)
tmp[k++]=array[i++];
while(j1)
tmp[k++]=array[j++];
//元素在tmp排好後,複寫其在array中對應的位置
for(k=start; k<=end; k++)
array[k]=tmp[k];}/*
* 拆分陣列到最細,然後逐級合併
*/void mergesort(int
array, int tmp, int start, int end)
時間複雜度為o(nlogn) (七)歸併排序
歸併排序也是八大排序演算法之一。當我們的待排序的資料資料量較大並且是線性結構時用快速排序進行排序操作。但是當我們要排序的資料是鏈式結構怎麼辦?這就引入了乙個改進的排序方法 歸併排序。它是建立在歸併操作上的一種有效的排序演算法,所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。該演算法是採用分治...
排序演算法 歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另...
排序演算法 歸併排序
include include define status int define max 20 typedef struct elemtype typedef struct sqlist void inital sqlist l 初始化 bool lt int i,int j void merge ...