基数排序

点击查看代码
#include<cstdio>
#pragma warning(disable:4996)

//桶排序:对元素按照flag(个、十、百位)进行排序
void BucketSort(int a[], int n, int flag) {
    int* tmp = new int[n]; //临时数组tmp[]暂存排序数据  
    //buckets[]是桶,其大小为数据的基数范围(本次测试为十进制,需要10个桶),bucket[i]存储尾数为i的元素个数
    int i, buckets[10] = { 0 };      

    /*
    1、分桶
    按照flag排序,将相同尾数的元素放进相同的桶中,如尾数k=a[i]/flag%10,则a[i]放入k桶中 
    */
    for (i = 0; i < n; i++) {
        buckets[a[i] / flag % 10]++;
    }

    /* 
    2、改桶
    让更改后的buckets[]值表示元素按尾数大小顺序摆放在tmp[]中的位置 
    尾数0固定放在开头,从尾数1开始修改
    */
    for (i = 1; i < 10; i++) { 
        buckets[i] = buckets[i - 1] + buckets[i];
    }

    /* 
    3、从桶中取数排序
    桶排序是后进后出,所以a[i]从最后取数,从后往前排序 
    */
    for (i = n - 1; i >= 0; i--) {
        tmp[buckets[a[i] / flag % 10] - 1] = a[i]; //数组从下标0开始,buckets[]减一才是元素在tmp[]中的真正位置
        buckets[a[i] / flag % 10]--; //每排好一个元素,桶中的尾数记录要减一
    }

    //4、把排序好的元素放回a[]中
    for (i = 0; i < n; i++) {
        a[i] = tmp[i];
    }

    delete[] tmp;//释放tmp[]的内存
}

/*
函数功能:基数排序(升序排序)
函数列表:
a[]:待排序序列
n:待排序元素个数
*/
void RadixSort(int a[], int n) {
    int flag; //排序模式:按个位排序时flag=1,按十位排序flag=10,按百位排序flag=100...
    int max = a[0]; //记录a[]中最大值,用于下面求最大flag位
    for (int i = 1; i < n; i++) { //查找a[]的最大值
        if (a[i] > max) {
            max = a[i];
        }
    }
    //每轮flag扩大10倍依次从个、十、百位对a[]进行桶排序,max/flag>0表示该flag位有效
    for (flag = 1; max / flag > 0; flag *= 10) {
        BucketSort(a, n, flag);
    }
}

posted @ 2022-09-26 21:57  zhaoo_o  阅读(2)  评论(0编辑  收藏  举报