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

2021-08-07 02:00:22 字數 1710 閱讀 4495

1、歸併排序是另一種運用分治排序的演算法,它的不同在於歸併過程-將兩個有序的資料集合合併成乙個有序的資料集。

所有情況下都能達到快速排序的平均效能,但是需要額外的儲存空間來執行,因為合併過程不能在無序資料本身執行。

會按照分的方式合,不用擔心是否為2的冪。

//把排序好的兩堆合併成一堆 

//i為頭,k為尾;i 到 j;j+1 到 k

static

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

void *key1, const

void *key2))

else

//左邊都小,前面已經放完,現在放入右邊

if(ipos > j)

}else

if(jpos > k)}}

//把排好的資料放回原來陣列對應區域

memcpy(&a[i * esize], m , esize*((k - i) + 1));

free(m);

return

0;}

int mgsort(void *data, int size, int esize, int i, int k, int (*compare)(const

void *key1, const

void *key2))

return

0;}

2、計數排序

線性排序,不同於前面的比較演算法,計數排序通過計算集合中整數出現的次數來決定集合應該如何排序。效率比o(nlgn)高,但是只能用於整形或者那些可以用整形來表示的資料集合。

//k是data中最大整數加1 ,0到k即k+1個數 

int ctsort(int *data, int size, int k)

memcpy(data, temp, size * sizeof(int));

free(counts);

free(temp);

return

0; }

3、基數排序

線性排序,先比較資料的最低位進行排序(每一位排序應用計數排序),然後次低位依次排序。

基數排序並不侷限於對整型資料進行排序,只要能把元素分割成整形數就可以使用基數排序。

//p是位數,k是進製 

int rxsort(int *data, int size, int p, int k)

for(i = 1;i < k;i++)

for(j = size - 1; j >= 0; j--)

memcpy(data, temp, size * sizeof(int));

free(counts);

free(temp);

return

0; }

}

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

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

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

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

排序演算法 歸併排序 計數排序

1.歸併排序 將待排序序列分成兩個長度相同的子串行,對每個子串行進行排序,直至子串行剩餘乙個數,在將其合併成乙個序列 具體步驟 分組 將待排序序列一分為2,在將子串行進行劃分,直至子串行只有乙個元素 歸併 將每個子串行進行排序,將排好序的兩個子串行進行合併 演算法分析 void merge data...