基数排序之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;
}

猜你喜欢

转载自www.cnblogs.com/hesper/p/10641073.html
今日推荐