// 默认次位D=1, 主位D<=MaxDigit intGetDigit(int X, int D){ int d; for (int i = 1; i <= D; i++) { d = X % Radix; X /= Radix; } return d; }
// 基数排序 - 次位优先 voidLSDRadixSort(intarray[], int size){ vector<list<int>> arr(Radix); // 将原始序列存入链表list list<int> list; for (int i = 0; i < size; i++) { list.push_back(array[i]); } // 开始排序 for (int D = 1; D <= MaxDigit; D++) { // 分配 for (auto& i : list) { int Di = GetDigit(i, D); arr[Di].push_back(i); } // 收集 list.clear(); for (auto& l : arr) { list.insert(list.end(), l.begin(), l.end()); l.clear(); } } // 将list倒入array[] for (int i = 0; i < size; i++) { array[i] = *list.begin(); list.pop_front(); } }
// 核心递归函数:对array[L]...array[R]的第D位数进行排序 voidMSD(intarray[], int L, int R, int D){ if (D == 0) { return; } vector<list<int>> arr(Radix); // 将原始序列存入链表list list<int> list; for (int i = L; i <= R; i++) { list.push_back(array[i]); } // 分配 for (auto& i : list) { int Di = GetDigit(i, D); arr[Di].push_back(i); } // 收集 int left = L; int right = L; for (auto& l : arr) { for (auto& i : l) { array[right++] = i; } // 递归对该桶数据排序,位数减1 MSD(array, left, right - 1, D - 1); left = right; } }