[算法入门]--桶排序

一、完整代码

随机数函数
int randint(int a, int b)
{
    return rand() % (b - a + 1) + a;
}

 

找最大位数函数
int maxbits(vector<int> &arr)
{
    int maxN = arr[0];
    for (auto i : arr)
    {
        maxN = max(i, maxN);
    } // 找最大值
    int res = 0;
    while (maxN)
    {
        res++;
        maxN /= 10;
    } // 求最大值有几个十进制位
    return res;
} // 找出数组最大的一个数有几位

 

 

 

找对应数位函数
int getDiget(int n, int d)
{
    n = n / pow(10, d - 1);
    return n % 10;
} // 取出一个数的某一位

 

基数(桶)排序函数
void radixSort(vector<int> &arr, int L, int R)
{
    int digets = maxbits(arr); // digit表示最大值有几个十进制位
    const int radix = 10;      // 排序十进制,确定基底为10

    vector<int> bucket; // 准备等大的额外空间
    bucket.resize(arr.size());

    for (int d = 1; d <= digets; d++) // 有几个数进出桶几次
    {
        vector<int> counts;
        counts.resize(radix); // 词频统计器统计每一位出现的次数
        for (auto i : arr)    // 遍历每一个数找到它的目标位,用counts统计
        {
            counts[getDiget(i, d)]++;
        }

        for (int i = 1; i < counts.size(); i++)
        {
            counts[i] += counts[i - 1];
        }

        for (int i = arr.size() - 1; i > -1; i--) // 从后往前遍历数组放入桶中
        {                                         // 从后往前遍历把该数放到该去的临时位置上
            // arr[i]是arr中的这个数
            // getDiget取出了目标位
            // counts[]找到了对应位存在几个数
            // bucket取最后一位数
            bucket[counts[getDiget(arr[i], d)] - 1] = arr[i];
            counts[getDiget(arr[i], d)]--; // 最后对应位置的计数器自减少
        }                                  // 全部放回临时数组了之后别忘记将计数器恢复

        arr = bucket; // 桶中元素倒入原来数组
    }
} // 基数排序[L, R]区间数组元素

 

初始化数组函数
vector<int> randomCreateArray(int size, int a, int b)
{
    cout << "creating array: ";
    vector<int> arr;
    for (int i = 0; i < size; i++)
    {
        arr.push_back(randint(a, b));
        cout << arr[i] << ' ';
    }
    cout << endl;
    return arr;
}

 

主函数
int main()
{
    srand(time(0));
    vector<int> arr = randomCreateArray(10, 1, 100);
    radixSort(arr, 0, arr.size() - 1);


    cout << "The sorted array:";
    for (auto i : arr)
        cout << i << ' ';
    cout << endl;
    //最后打印有序数组即可

    system("pause");
}

 

 

 

posted @ 2023-12-04 01:21  IoOozZzz  阅读(17)  评论(0)    收藏  举报  来源