演算法精解(三) 歸併排序

2021-12-29 23:43:50 字數 1191 閱讀 5952

歸併排序

o(nlogn),所以歸併排序最壞情況能夠達到快速排序的平均水準

需要額外的儲存空間o(n)

1、對資料不斷的分割,直到剩下乙個乙個的

2、合併資料,在合併的時候,其實是兩個有序的陣列,因此

這個過程是兩個有序陣列進行合併排序

// 歸併排序

// o(nlogn),所以歸併排序最壞情況能夠達到快速排序的平均水準

// 需要額外的儲存空間o(n)

// 1、對資料不斷的分割,直到剩下乙個乙個的

// 2、合併資料,在合併的時候,其實是兩個有序的陣列,因此

// 這個過程是兩個有序陣列進行合併排序

#include "sort.h"

// merge函式實現了合併的過程

// i為陣列最小索引,j為中間值,k為最大索引值

int merge(void *data, int size, int esize, int i, int k, int j,

int (*compare)(const void *key1, const void *key2))

memcpy(m, 0, sizeof(int) * size);

ipos = i;

jpos = j; // j為中間值

mpos = 0;

while (ipos <= j || jpos <= k)

while (ipos >= j && jpos <= k) // 當就剩下j的索引沒有到中間

if (compare(&a[ipos], &a[jpos]) <= 0 ) // 小的數先插入到m臨時序列

else

}data = m; // 返回data,此時已完成排序

free(m); // 最後釋放m

return 0;

}// 排序函式

int mgsort(void *data, int size, int esize, int i, int k,

int (*compare)(const void *key1, const void *key2))

if (mgsort(data, size, esize, j+1, k, compare))// 分割右邊

if (merge(data, size, esize, i, k, j, compare) < 0)

}return 0;

}

演算法精解(三) 歸併排序

歸併排序 o nlogn 所以歸併排序最壞情況能夠達到快速排序的平均水準 需要額外的儲存空間o n 1 對資料不斷的分割,直到剩下乙個乙個的 2 合併資料,在合併的時候,其實是兩個有序的陣列,因此 這個過程是兩個有序陣列進行合併排序 歸併排序 o nlogn 所以歸併排序最壞情況能夠達到快速排序的平...

演算法精解 19 歸併排序 計數排序 基數排序

1 歸併排序是另一種運用分治排序的演算法,它的不同在於歸併過程 將兩個有序的資料集合合併成乙個有序的資料集。所有情況下都能達到快速排序的平均效能,但是需要額外的儲存空間來執行,因為合併過程不能在無序資料本身執行。會按照分的方式合,不用擔心是否為2的冪。把排序好的兩堆合併成一堆 i為頭,k為尾 i 到...

排序演算法三歸併排序

歸併排序 merge sort 是利用歸併的思想實現的排序方法,該演算法採用經典的分治 divide and conquer 策略 分治法將問題分 divide 成一些小的問題然後遞迴求解,而治 conquer 的階段則將分的階段得到的各答案 修補 在一起,即分而治之 遞迴 實現 void merg...