資料結構 基數排序(桶排序)

2021-08-13 14:41:53 字數 1662 閱讀 5234

基數排序和計數排序都屬於「非比較排序」,有關計數排序可檢視

基數排序介紹:基數排序(radix sort)屬於「分配式排序」(distribution sort),又稱「桶子法」(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用。按照排序的順序會被分為:最高位優先法和最低位優先法。以下實現的是最低位優先法(lsd)。

基數排序是穩定排序,所謂穩定不穩定是說序列中相同元素經過排序後,他們的先後順序不變。

思路先按照最低位進行排序,接下來是次高位,一直到資料中最大的位數排序完。

1、計算出陣列中最大的數字是幾位數;是幾位數我們在接下來的排序中最外層就會迴圈幾次;

2、開闢乙個「桶」以及用來臨時存放排序的陣列;「桶」只開闢十個int大小,因為十進位制下只有0-9十個數字,用來記錄資料的某一位對應數字出現的次數,(例如,3,23,那麼當個位數在進行排序時bucket[3] = 2);另開闢乙個n個元素的tmp陣列,用來暫時存放排序的結果;

3、每次最外層迴圈開始時,先將bucket陣列重新都置為0,計算出陣列中所有元素對應位(例,個位,十位,百位)出現的個數,並同步到bucket陣列中;

4、按照bucket陣列中的順序,將資料排序到tmp陣列中;

5、redix*=10,再進行下一輪的迴圈。

實現以及測試**如下:
#include 

using

namespace

std;

//求陣列中最大數的位數

int getbitnum(int* arr, int n)

}return maxbitnum;

}void redix_sort(int* arr, int n)

//轉換為下標,方便一會用

for (int i = 1; i < 10; i++)

bucket[i] = bucket[i - 1] + bucket[i];

//重新排序陣列

for (int i = n - 1; i >= 0; i--)

//拷貝回原陣列,進行下一輪排序

for (int i = 0; i < n; i++)

arr[i] = tmp[i];

//準備下一位

redix *= 10;

}}int main()

; redix_sort(arr, sizeof(arr) / sizeof(arr[0]));

for (int i = 0; i < 10; i++)

cout

<< arr[i] << " ";

cout

<< endl;

system("pause");

return0;}

//輸出結果:2 6 14 28 39 43 55 73 81 93

圖示基數排序過程:

基數排序(桶排序)

1。什麼是基數排序 radix sort 基數排序 屬於分配式排序 distribution sort 又稱 桶排序 bucket sort 它是通過鍵值的各個位的值,將要排序的元素分配至某些 桶 中,達到排序的作用。2.它和歸併一樣,屬於穩定型演算法。public void radixsort i...

基數排序(桶排序)

思想 先把這組資料的個位排有序,再把十位排有序,再排百位 千位 include include include include void showarr int arr,int len printf n int getmaxnumfin int arr,int len 找陣列中最大數,並求出最大數的...

基數排序 桶排序

1.基數排序又稱桶排序,具體思想就是將數值當成陣列的下標儲存。2.將所有數值拿出個位來比較,例如值為m的就存入下標為m的陣列中。3.將比較後的陣列拿出即為按個位排序好的陣列,再將這個排序好的陣列按十位排序。4.比較完個十百千所有位數以後即排序完成。兩種 實現思路都是一樣的,實現方式1可直接改寫為c或...