基数排序之LSD
作者:互联网
基数排序之LSD
void lsdRadixSort(int *a, int arraySize)
{
int i, maxVal = 0, digitPosition = 1;
int *bucket = new int[arraySize];
for (i = 0; i < arraySize; i++) // 确定最大元素以确定多少位
if (a[i] > maxVal) maxVal = a[i];
while (maxVal / digitPosition > 0) {
int digitCount[10] = { 0 };
for (i = 0; i < arraySize; i++) // 类似计数排序记录每一个位上多少数字
digitCount[(a[i] / digitPosition) % 10]++;
for (i = 1; i < 10; i++) // 累加目的是为了确定排序后每个数字应该位于第几位
digitCount[i] += digitCount[i - 1];
for (i = arraySize - 1; i >= 0; i--)// 为保证稳定性, 从右往左扫描
bucket[--digitCount[a[i] / digitPosition % 10]] = a[i];
for (i = 0; i < arraySize; i++) // 把桶里数字放到数组中
a[i] = bucket[i];
digitPosition *= 10; // 开始比较下一位
}
delete[] bucket;
}
测试
#include <iostream>
using namespace std;
void lsdRadixSort(int *a, int arraySize)
{
int i, maxVal = 0, digitPosition = 1;
int *bucket = new int[arraySize];
for (i = 0; i < arraySize; i++) // 确定最大元素以确定多少位
if (a[i] > maxVal) maxVal = a[i];
while (maxVal / digitPosition > 0) {
int digitCount[10] = { 0 };
for (i = 0; i < arraySize; i++) // 类似计数排序记录每一个位上多少数字
digitCount[(a[i] / digitPosition) % 10]++;
for (i = 1; i < 10; i++) // 累加目的是为了确定排序后每个数字应该位于第几位
digitCount[i] += digitCount[i - 1];
for (i = arraySize - 1; i >= 0; i--)// 为保证稳定性, 从右往左扫描
bucket[--digitCount[a[i] / digitPosition % 10]] = a[i];
for (i = 0; i < arraySize; i++) // 把桶里数字放到数组中
a[i] = bucket[i];
digitPosition *= 10; // 开始比较下一位
}
delete[] bucket;
}
int main() {
int a[] = { 149, 192, 66, 66, 47, 152, 159, 195, 61, 66, 17, 168, 118, 64, 27, 80, 30, 105 };
int len = (sizeof(a)) / sizeof(a[0]);
cout << "排序之前: " << endl;
for (int i = 0; i < len; i++) {
cout << a[i] << " ";
}
cout << endl;
lsdRadixSort(a, len);
cout << "排序之后: " << endl;
for (int i = 0; i < len; i++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}
标签:10,LSD,digitPosition,int,++,基数排序,arraySize,digitCount 来源: https://www.cnblogs.com/hesper/p/10641073.html