從個位數開始,逐位做穩定排序,觀察每一位數如何影響最終排序結果。
每輪依照目前位數把資料放進 bucket[0] ~ bucket[9],再依序回寫回陣列。
這裡示範 LSD(Least Significant Digit)版本,從個位數開始一路排到最高位數。
exp(1、10、100...)抽出當前位數。#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void countingSortByDigit(vector<int>& arr, int exp) {
int n = static_cast<int>(arr.size());
vector<int> output(n);
int count[10] = {0};
for (int x : arr) {
int digit = (x / exp) % 10;
count[digit]++;
}
for (int i = 1; i < 10; ++i) {
count[i] += count[i - 1];
}
for (int i = n - 1; i >= 0; --i) {
int digit = (arr[i] / exp) % 10;
output[count[digit] - 1] = arr[i];
count[digit]--;
}
for (int i = 0; i < n; ++i) {
arr[i] = output[i];
}
}
void radixSort(vector<int>& arr) {
int maxVal = *max_element(arr.begin(), arr.end());
for (int exp = 1; maxVal / exp > 0; exp *= 10) {
countingSortByDigit(arr, exp);
}
}
int main() {
vector<int> data = {170, 45, 75, 90, 802, 24, 2, 66};
radixSort(data);
cout << "排序結果: ";
for (int x : data) {
cout << x << " ";
}
cout << endl;
return 0;
}