基數排序(也叫桶排序)是一種很特別的排序方法,它不是基於比較進行排序的,而是採用多關鍵字排序思想(即基於關鍵字各位的大小進行排序的),借助「分配」和「收集」兩種操作對單邏輯關鍵字進行排序。
基數排序又分為最高位優先(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 實際操作時,是將依次將個位 十位 百位的相同的數放入同乙個桶中,高位不足補零。然後再從桶中收集元素...