桶排序(基数排序)

//
// Created by Administrator on 2021/8/1.
//

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

class RadixSorted {
public:
    RadixSorted(vector<int> An);
    static void radixSort(vector<int> &A);
    static int maxBits(vector<int> &A);
    static int getBits(int x, int d);
    static void radixSort(vector<int> &A, int L, int R, int digit);
private:
    vector<int> A;
};

RadixSorted::RadixSorted(vector<int> An) :
A(An){
    A.resize(An.size());
}

int RadixSorted::maxBits(vector<int> &A) {
    int max = INT_MIN;
    for(int i = 0; i<A.size();++i){
        if(A[i]>max){
            max = A[i];
        }
    }
    int res = 1;
    while(max/10 !=0){
        res++;
        max /= 10;
    }
    return res;
}
int RadixSorted::getBits(int x, int d) {
    return ((x/(int)(pow(10, d-1)))%10);
}
void RadixSorted::radixSort(vector<int> &A) {
    if(A.empty() || A.size() == 1){
        return;
    }
    radixSort(A, 0, A.size()-1, maxBits(A));
}

void RadixSorted::radixSort(vector<int> &A, int L, int R, int digit) {
    int i, j;
    vector<int> help(R-L+1);
    //从个位开始遍历
    for(int d = 1;d <= digit; ++d){
        vector<int> count(10);
        for(i = L; i < A.size(); ++i){
            count[getBits(A[i], d)]++;
        }
        for(i = 1; i < 10; ++i){
            count[i] += count[i-1];
        }
        for(j = R; j>=L; --j){
            help[--count[getBits(A[j], d)]] = A[j];
        }
    }
    for(i = L, j = 0; i<help.size(); ++i, ++j){
        A[i] = help[j];
    }
}

#endif //C__TEST01_RADIXSORTED_HPP

posted @   蘑菇王国大聪明  阅读(36)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示