基數排序(radix sort)屬於“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度爲O (nlog(r)m),其中r爲所採取的基數,而m爲堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。
此算法結合計數排序以空間換時間的思路進行基數數排序,元素必須爲整數(正數、負數、0)
#include <stdlib.h>
#include <stdio.h>
#include <list>
#include <vector>
void print(std::vector<int> arr) {
for (int i = 0; i < arr.size(); i++) {
printf("%6d", arr[i]);
}
printf("\n");
}
void radixSort(std::vector<int> arr,int base) {
int n = arr.size(); //獲取元素個數
int radixSize = 19; //桶個數
int offset = 9; //標記相對於數組0的偏移位數
bool tag = false; //標記是否需要遞歸
std::vector<int> result(n, 0); //存儲最終計算結果
std::vector<int> tmpRecord(n, 0); //存儲索引,次索引可以不存儲,但是取數據的時候需要重新映射計算
result.resize(n, 0);
tmpRecord.resize(n, 0);
int mapArr[19] = {0}; //區間集合聲明用[0,18] 表示 [-9.9]
for (int i = 0; i < n; i++) {
int tmp = arr[i] /base;
if (tmp > 0) {
tag = true;
}
int r = tmp % 10;
mapArr[r+offset]++;
tmpRecord[i] = r+offset;
}
if (!tag) { //驗證排序是否完畢
print(arr); //打印測試
return;
}
//分佈計算
for (int i = 1; i < radixSize; i++) {
mapArr[i] += mapArr[i - 1];
}
//還原
for (int i = n-1; i>=0; i--) {
result[mapArr[tmpRecord[i]]-1] = arr[i];
mapArr[tmpRecord[i]]--;
}
if (tag) {//排序未完畢,繼續排序
base *= 10;
radixSort(result,base);
}
}
void radixSort(std::vector<int> arr) {
radixSort(arr, 1);
}
int main(){
std::vector<int> a = { 2,5,3,0,2,3,0,-1};
//bsort(a, 8,-1,6);
radixSort(a);
return 0;
}