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;}
2、計數排序int mgsort(void *data, int size, int esize, int i, int k, int (*compare)(const
void *key1, const
void *key2))
return
0;}
線性排序,不同於前面的比較演算法,計數排序通過計算集合中整數出現的次數來決定集合應該如何排序。效率比o(nlgn)高,但是只能用於整形或者那些可以用整形來表示的資料集合。
3、基數排序//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; }
線性排序,先比較資料的最低位進行排序(每一位排序應用計數排序),然後次低位依次排序。
基數排序並不侷限於對整型資料進行排序,只要能把元素分割成整形數就可以使用基數排序。
//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...