資料結構 歸併排序 基數排序

2021-08-31 04:03:37 字數 1560 閱讀 1035

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...