排序演算法四 歸併排序

2021-08-20 10:12:01 字數 1672 閱讀 7972

歸併排序

思想:

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 即序列元素...

漫談經典排序演算法 四 歸併排序 合併排序

這是 漫談經典排序演算法系列 第四篇,解析了歸併排序。各種排序演算法的解析請參考如下 漫談經典排序演算法 一 從簡單選擇排序到堆排序的深度解析 漫談經典排序演算法 二 各種插入排序解析及效能比較 漫談經典排序演算法 三 氣泡排序 快速排序 漫談經典排序演算法 四 歸併排序 漫談經典排序演算法 五 線...

漫談經典排序演算法 四 歸併排序 合併排序

這是 漫談經典排序演算法系列 第四篇,解析了歸併排序。漫談經典排序演算法 一 從簡單選擇排序到堆排序的深度解析 漫談經典排序演算法 二 各種插入排序解析及效能比較 漫談經典排序演算法 三 氣泡排序 快速排序 漫談經典排序演算法 四 歸併排序 漫談經典排序演算法 五 線性時間排序 計數 基數 桶排序 ...