1.歸併排序:是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。
例:設有數列
初始狀態:6,202,100,301,38,8,1
第一次歸併後:,,,,比較次數:3;
第二次歸併後:,,比較次數:4;
第三次歸併後:,比較次數:4;
總的比較次數為:3+4+4=11;
逆序數為14;
2.基數排序:屬於「分配式排序」又稱「桶子法或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為o (nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。
附:各種排序時空複雜度對比
歸併排序實現:
#include#includevoid merge(int arr, int tmp, int startindex,
int mid, int endindex)
if (arr[i] > arr[j])
}while (i < mid + 1)
while (j < endindex + 1)
for (int i = startindex; i <= endindex; ++i) }
void merges(int arr, int tmp, int startindex, int endindex)
}void mergesort(int arr, int len)
基數排序實現:
include#include#include#define maxsize 10
void show(int arr, int len)
printf("\n");
}//9031 ==> 4
int findmaxfinger(int arr, int len)
} int count = 0;
while (maxnum != 0)
return count;
}//893 1 ==> 9
int findfinnumber(int num, int fin)
void radix(int arr, int len, int fin)
; int finnum = 0;
int num[10] = {};
for (int i = 0; i < len; ++i)
int aindex = 0;
int bindex = 0;
for (int i = 0; i < 10; ++i) }
}void radixsort(int arr, int len)
}
資料結構複習 歸併排序和基數排序
歸併排序與基於交換 選擇等排序的思想不一樣,歸併 的含義是將兩個或兩個以上的有序表組合成乙個新的有序表。假定待排序表含有n個記錄,則可以看成是n個有序的子表,每個子表長度為1,然後兩兩歸併,得到 n 2 個長度為2或1的有序表 再兩兩歸併,如此重複,直到合併成乙個長度為n的有序表為止,這種排序方法稱...
歸併排序和基數排序
空間複雜度 o n o n o n 時間複雜度 o n log2 n o nlog 2n o nlog 2 n 穩定性 穩定 適用於順序儲存和鏈式儲存 typedef int elemtype 合併兩個相鄰的有序線性表 void merge elemtype a,int low,int mid,in...
11 歸併排序和基數排序
核心思想 拆分和合併,拆分其實只幹了一件事將陣列2等份,一直拆分到無法拆分為止,合併在於從最小拆分單元先排序,然後向上合併再排序,最終得到乙個有序陣列。分支演算法採用的遞迴操作,核心 在於合併。public class mergesort int temp newint arr.length mer...