C++ 实现基数排序

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序基于计数排序。

  • 统计待排序数组中最长位数。
int maxBit(vector<int> vec) { //返回vector中最长的元素有几位
    int max = vec[0];
    for (int i = 1; i < vec.size(); i++) {
        if (vec[i] > max) max = vec[i];
    }
    int p = 1;
    while (max/10 != 0) {
        max = max / 10;      
        p++;
    }
    return p;
}
  • 基数排序
    按第1位、第2位…第maxbit位的数字进行排序
void radixSort(vector<int>& vec) {
    int maxbit = maxBit(vec); //最长位数是多少,代表要进行几次排序
    for (int i = 1; i <= maxbit; i++) { //i为多少,代表按第几位数字比较(从右向左)
        vec=countSort(vec, i);
    }
}

这里用到了一个countSort函数,由于基数排序是基于计数排序的,这个函数的作用就是按照第place位的数字对vec数组进行计数排序。

vector<int>  countSort(vector<int> vec,int place) {//按指定位置的值进行计数排序
    vector<int> temp(vec); //临时数组,存储place位置的值
    vector<int> ordered(vec); //排好序的数组放进ordered
    int count[10] = {0};
    for (int i = 0; i < vec.size(); i++) {
        temp[i] =(int)(vec[i] / pow(10, place - 1) )% 10; //找到每个元素place位置上的数字存在temp中
    }
    for (int i = 0; i < vec.size(); i++) {
        count[temp[i]] ++; //统计数字出现的频率
    }
    for (int i = 1; i < 10; i++) {
        count[i] = count[i] + count[i - 1]; //此时count中存放着temp中每个数字的索引
    }
    for (int i = vec.size()-1; i >=0; i--) {
        int index = count[temp[i]]-1;
        count[temp[i]]--;
        ordered[index] = vec[i];
    }
    cout << "next:" << endl;
    for (int i = 0; i < vec.size(); i++) {
        cout << ordered[i] << "  ";
    }
   
    return ordered;
}

完整代码:

// 基数排序.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <math.h>
using namespace std;

int maxBit(vector<int> vec) {
    int max = vec[0];
    for (int i = 1; i < vec.size(); i++) {
        if (vec[i] > max) max = vec[i];
    }
    int p = 1;
    while (max/10 != 0) {
        max = max / 10;      
        p++;
    }
    return p;
}
vector<int>  countSort(vector<int> vec,int place) {//按指定位置的值进行计数排序
    vector<int> temp(vec); //临时数组,存储place位置的值
    vector<int> ordered(vec); //排好序的数组放进ordered
    int count[10] = {0};
    for (int i = 0; i < vec.size(); i++) {
        temp[i] =(int)(vec[i] / pow(10, place - 1) )% 10; //找到每个元素place位置上的数字存在temp中
    }
    for (int i = 0; i < vec.size(); i++) {
        count[temp[i]] ++; //统计数字出现的频率
    }
    for (int i = 1; i < 10; i++) {
        count[i] = count[i] + count[i - 1]; //此时count中存放着temp中每个数字的索引
    }
    for (int i = vec.size()-1; i >=0; i--) {
        int index = count[temp[i]]-1;
        count[temp[i]]--;
        ordered[index] = vec[i];
    }
    //cout << "next:" << endl;
   
    return ordered;
}
void radixSort(vector<int>& vec) {
    int maxbit = maxBit(vec); //最长位数是多少,代表要进行几次排序
    for (int i = 1; i <= maxbit; i++) { //i为多少,代表按第几位数字比较(从右向左)
        vec=countSort(vec, i);
    }
    for (int i = 0; i < vec.size(); i++) {
        cout << vec[i] << "  ";
    }

}
int main()
{
    vector<int> vec{ 3, 5, 34, 10, 8, 6, 16, 5, 8, 6, 2, 4, 900, 4, 7, 0, 1, 8, 9, 7, 38, 1, 2, 5, 9, 7, 4, 0, 2, 6 };
    radixSort(vec);
}

测试截图:

在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值