歸併排序(merge-sort)是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案」修補」在一起,即分而治之)。
遞迴**實現:
void merge(int
array, int *temp, int left, int mid, int right)
while(start1 <= end1)
temp[index++] = array[start1++];
while(start2 <= end2)
temp[index++] = array[start2++];
}void mergesort(int *array, int *temp, int left, int right)
}void mergesort(int
array, int size)
非遞迴演算法:
**實現:
void merge(int
array, int *temp, int left, int mid, int right)
while(start1 <= end1)
temp[index++] = array[start1++];
while(start2 <= end2)
temp[index++] = array[start2++];
}void mergesort(int *array, int *temp, int size )
memcpy(array, temp, size*sizeof(array[0])); //這裡是歸併一趟完了,整個拷貝。如將整個gap=1歸併完了,拷貝
gap =gap*2;
}}void mergesort(int
array, int size)
時間複雜度為o(n*logn),沒有最好的情況和最壞的情況,空間複雜度為o(n),是乙個穩定的演算法。 比較次數與待排序記錄的初始化狀態無關。
外部排序。磁碟檔案排序
排序三(歸併排序)
其實和兩個有序單鏈表的排序有點相似,不斷劃分子區間,然後將每乙個有序的子區間兩兩進行合併 需要借助乙個額外的空間,將合併的區間拷下來 直到最後合成乙個區間,排序就完成了 其實歸併排序也稱外排序 對記憶體可以進行排序,對磁碟也可以進行排序 例如有這麼乙個題 要求排序100萬個數,這些數無法都載入到記憶...
排序演算法 歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 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 ...