基数排序 算法


基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

此算法结合计数排序以空间换时间的思路进行基数数排序,元素必须为整数(正数、负数、0)

#include <stdlib.h>
#include <stdio.h>
#include <list>
#include <vector>
void print(std::vector<int> arr) {
    for (int i = 0; i < arr.size(); i++) {
        printf("%6d", arr[i]);
    }
    printf("\n");
}
 
 
void radixSort(std::vector<int> arr,int base) {
    int n = arr.size();		//获取元素个数
    int radixSize = 19;		//桶个数
    int offset = 9;	//标记相对于数组0的偏移位数
    bool tag = false;  //标记是否需要递归
    std::vector<int> result(n, 0); //存储最终计算结果
    std::vector<int> tmpRecord(n, 0); //存储索引,次索引可以不存储,但是取数据的时候需要重新映射计算
    result.resize(n, 0);
    tmpRecord.resize(n, 0);
 
    int mapArr[19] = {0};  //区间集合声明用[0,18] 表示 [-9.9]
    for (int i = 0; i < n; i++) {
        int tmp = arr[i] /base;
        if (tmp > 0) {
            tag = true;
        }
        int r = tmp % 10;
        mapArr[r+offset]++;
        tmpRecord[i] = r+offset;
    }
    if (!tag) {	  //验证排序是否完毕
        print(arr);					//打印测试
        return;
    }
 
    //分布计算
    for (int i = 1; i < radixSize; i++) {
        mapArr[i] += mapArr[i - 1];
    }
 
     //还原
    for (int i = n-1; i>=0; i--) {
        result[mapArr[tmpRecord[i]]-1] = arr[i];
        mapArr[tmpRecord[i]]--;
    }
 
 
    if (tag) {//排序未完毕,继续排序
        base *= 10;
        radixSort(result,base);
    }
}
 
void radixSort(std::vector<int> arr) {
    radixSort(arr, 1);
}
 
 
int main(){
    std::vector<int> a = { 2,5,3,0,2,3,0,-1};
    //bsort(a, 8,-1,6);
    radixSort(a);
 
    return 0;
}

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值