#include <vector> #include <set> #include <algorithm> void ArrPrint(std::vector<int> const & arr){ for (auto i : arr){ printf("%d ", i); } printf("\n"); } //iBase 桶數 void radixsort(std::vector<int> & arr,unsigned int iBase){ if (0 == iBase) iBase = 10; int iExp = 1; //將數據分配到桶內的依據位 1 1*iBase 1*iBase*iBase ... int iMax = *std::max_element(arr.begin(), arr.end()); while (iMax / iExp > 0){ std::vector<int> bucket,temp; bucket.resize(iBase); //桶 temp.resize(arr.size()); //臨時數組,用於收集桶內數據 for (auto i : arr){ bucket[i / iExp%iBase]++; //計算每一個桶內數據個數 } for (int i = 1; i < bucket.size(); i++) bucket[i] += bucket[i - 1]; // 爲了收集桶數據,計算每一個桶以及前面全部桶的數據個數總數 // 也就知道 arr[i] 在收集桶內數據時,排第幾 for (int i = arr.size() - 1; i >= 0; i--){ int iCount = bucket[arr[i] / iExp %iBase]; // 將數據劃分到桶內後, //桶 arr[i] / iExp %iBase 本身以及前面一共有多少個數據 temp[--iCount] = arr[i]; //若是某個桶自己已經前面的桶一共有 //iCount個數字,則從第一個桶開始收集, //這個桶的作後一個數字在收集後數組的下標是 iCount-1 bucket[arr[i] / iExp %iBase] = iCount; // 桶內數據減一,基於這個緣由, //本循環要從n-1到0迭代,不然收集桶數據的temp下標計算錯誤 } std::copy(temp.begin(), temp.end(), arr.begin()); //將收集的數據重新放入數組,用於下次分配 printf("\nPASS : "); ArrPrint(arr); iExp *= iBase; } } int main() { std::vector<int> arr = { 521, 310, 72, 373, 15, 546, 385, 856, 187, 147 }; printf("\nARRAY : "); ArrPrint(arr); radixsort(arr,10); //分紅10個桶進行排序 printf("\nSORTED : "); ArrPrint(arr); return 0; }
能夠使用不一樣的 iBase(桶個數)驗證, (二、4 驗證正確。) 算法
算法分析(桶分配過程與桶數據收集) :http://blog.csdn.net/cjf_iceking/article/details/7943609 數組