基數排序詳解及例項實現

2021-10-04 09:52:27 字數 3396 閱讀 4289

基數排序(也叫桶排序)是一種很特別的排序方法,它不是基於比較進行排序的,而是採用多關鍵字排序思想(即基於關鍵字各位的大小進行排序的),借助「分配」和「收集」兩種操作對單邏輯關鍵字進行排序。

基數排序又分為最高位優先(msd)排序和最低位優先(lsd)排序

最低位用的比較多

是根據鍵值的每位數字來分配桶的

r為所採取的基數,而n為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。

以低位(lsd)為例

從低位到高位的順序進行排序

例如最高是百位的話,先從個位開始排序,然後是十位,最後是百位,如**所示

o (r

)o(r)

o(r)

o (d

(n+r

))o(d(n+r))

o(d(n+

r))穩定

順序儲存和鏈式儲存

c++

void

radixsort

(int arr,

int length)

// 統計每個桶裡的元素出現的次數

for(j =

0; j < length; j++

)// 更改buckets[i],目的:讓更改後的buckets[i]的值,是在資料在tmp中的位置

for( j =

1; j <

10; j++

)// 將桶內記錄依次放到tmp陣列中

for(j = length -

1; j >=

0; j--

)// 將臨時陣列中的內容複製到原陣列中

for(j =

0; j < length; j++

) radix = radix *10;

// radix 的目的是保值下一次取到更高位的值

}//刪除陣列

delete

tmp;

delete

buckets;

}// 找到資料裡最大的位數

intfindmax

(int arr,

int length)

// 此時已找到最大數maxnum

// 接下來找到最大數的位數

int maxindex =1;

//初始值設定為1

while

(maxnum >=10)

//如果最大值不超過10,則maxindex就是1

return maxindex;

}

/*

* @descripttion:

* @version:

* @author: edisonhuang

* @date: 2020-03-25 13:20:16

* @lasteditors: edisonhuang

* @lastedittime: 2020-03-25 16:33:03

*/#include

using

namespace std;

void

print

(int arr,

int length)

;void

radixsort

(int arr,

int length)

;int

findmax

(int arr,

int length)

;int

main()

;int len =

(int

)sizeof

(arr)

/sizeof

(*arr)

;print

(arr,len)

;radixsort

(arr,len)

;print

(arr,len)

;return0;

}void

radixsort

(int arr,

int length)

// 統計每個桶裡的元素出現的次數

for(j =

0; j < length; j++

)// 更改buckets[i],目的:讓更改後的buckets[i]的值,是在資料在tmp中的位置

for( j =

1; j <

10; j++

)// 將桶內記錄依次放到tmp陣列中

for(j = length -

1; j >=

0; j--

)// 將臨時陣列中的內容複製到原陣列中

for(j =

0; j < length; j++

) radix = radix *10;

// radix 的目的是保值下一次取到更高位的值

}//刪除陣列

delete

tmp;

delete

buckets;

}// 找到資料裡最大的位數

intfindmax

(int arr,

int length)

// 此時已找到最大數maxnum

// 接下來找到最大數的位數

int maxindex =1;

//初始值設定為1

while

(maxnum >=10)

//如果最大值不超過10,則maxindex就是1

return maxindex;

}void

print

(int arr,

int length )

cout << endl;

}

最大的難點應該就是這兩個迴圈了

// 更改buckets[i],目的:讓更改後的buckets[i]的值,是在資料在tmp中的位置

for( j =

1; j <

10; j++

)// 將桶內記錄依次放到tmp陣列中

for(j = length -

1; j >=

0; j--

)

如何理解這兩個迴圈,決定了如何理解演算法如何確定出每個元素在tmp陣列中的下標表示

int arr = ;為例子

第乙個迴圈的作用

目的:讓更改後的buckets[i]的值,是在資料在tmp中的位置

第二個迴圈的作用

將桶內記錄依次放到tmp陣列中

python 基數排序詳解

今天簡單的說下基數排序,基數排序比較特殊,他不用元素之間進行比較,也不用元素之間交換位置,你只需要堆元素進行分類就可以了,這個也恰巧就是基數排序的魅力。基數排序思想 基數排序是桶排序的一種擴充套件,將整數按位數分割成不同數字,然後按照每個位數分別比較 過程 1.分配 先從個位開始,根據位值 0 9 ...

基數排序的實現及測試

基數排序過程無須比較關鍵字,而是通過 分配 和 收集 過程來實現排序。它們的時間複雜度可達到線性階 o n 是一種穩定排序 基數排序的實現 用陣列的方式,還可以通過鍊錶實現 pragma once 基數排序 include using namespace std include include in...

排序演算法 基數排序詳解

筆者今天學習字尾陣列,發現需要用到基數排序,所以趕緊學習一波。基數排序是基於關鍵字排序,先比較第乙個關鍵字,再比較第二個關鍵字。舉個栗子 假如我們有一堆數,17,8,25,78,123,512,250 實際操作時,是將依次將個位 十位 百位的相同的數放入同乙個桶中,高位不足補零。然後再從桶中收集元素...