歸併排序
思想:
1、先對資料的整體進行劃分:把資料劃分為左右均等的兩部分,繼續劃分,直到資料分組有序為止;
2、每個分組只剩下乙個元素則是有序的
3、把兩個部分(資料)歸併成乙個部分:逐次歸併:給定乙個輔助空間,給定乙個指標放在第乙個陣列的起始位置x1,給定另乙個指標放在另乙個陣列的起始位置x2,給定第三個指標放在輔助空間的位置x3比較x1和x2,將較小的元素搬移到輔助空間中,把剛剛較小的那個元素的指標向該陣列的下乙個位置移動。x3向後走一步,繼續比較x1和x2,並搬移元素。
實現**
//合併需要給定兩個陣列的空間及輔助空間
void mergedata(int *array, int left, int mid,int right,int *tmp)
//左邊的資料沒有搬移完
while (beginl < endl)
//右邊的資料沒有搬移完
while (beginr < endr) }
void _mergesort(int *array, int left, int right, int *tmp)
}void mergesort(int *array, int size)
//排序
_mergesort(array, 0, size,tmp);
//釋放空間
free(tmp);
}
時間複雜度:每層需要o(n),平衡樹,深度為lgn所以時間複雜度為o(nlgn);沒有最好和最差的場景
空間複雜度:o(n):借助了乙個輔助空間
穩定性:穩定的,相鄰元素歸併在一起,不可能出現跨區間交換……
適用於:資料量比較大,一次載入不了的資料(外部排序)
4、非遞迴的方式實現(也需要輔助空間)
//合併需要給定兩個陣列的空間及輔助空間
void mergedata(int *array, int left, int mid, int right, int *tmp)
//左邊的資料沒有搬移完
while (beginl < endl)
//右邊的資料沒有搬移完
while (beginr < endr) }
void mergesortnor(int *array, int size)
while (gapsize)//防止mid越界
mid = size;
if (right > size)//防止right越界
right = size;
mergedata(array, left, mid, right, tmp);
} //將元素拷回去
memcpy(array, tmp, size*sizeof(array[0]));
//歸併下一次的資料
gap *= 2;
} free(tmp);
}
排序演算法(四) 歸併排序
合併排序也即歸併排序,是將兩個或兩個以上的有序表合併成乙個新的有序表的操作,是分治法的乙個典型應用。先使每個子串行有序 段內有序 再使子串行段間有序,最後合併後得到完全有序的序列。歸併排序可以使用遞迴實現,遞迴的條件是序列起始位置 startindex 小於序列結束位置 endindex 即序列元素...
漫談經典排序演算法 四 歸併排序 合併排序
這是 漫談經典排序演算法系列 第四篇,解析了歸併排序。各種排序演算法的解析請參考如下 漫談經典排序演算法 一 從簡單選擇排序到堆排序的深度解析 漫談經典排序演算法 二 各種插入排序解析及效能比較 漫談經典排序演算法 三 氣泡排序 快速排序 漫談經典排序演算法 四 歸併排序 漫談經典排序演算法 五 線...
漫談經典排序演算法 四 歸併排序 合併排序
這是 漫談經典排序演算法系列 第四篇,解析了歸併排序。漫談經典排序演算法 一 從簡單選擇排序到堆排序的深度解析 漫談經典排序演算法 二 各種插入排序解析及效能比較 漫談經典排序演算法 三 氣泡排序 快速排序 漫談經典排序演算法 四 歸併排序 漫談經典排序演算法 五 線性時間排序 計數 基數 桶排序 ...