箱子排序和基数排序

本文介绍了两种复杂度为O(n)的排序算法——箱子排序和基数排序。箱子排序通过创建箱子并将数据放入对应箱子,然后连接非空箱子实现排序。基数排序则是在箱子排序基础上,针对大数据范围优化,通过数字分解和多次按位排序来避免大范围带来的问题。这两种排序方法虽然实现复杂,但能有效提升程序性能。
摘要由CSDN通过智能技术生成

之前有一个关于排序方法的总结详见该篇博文在总结中四种排序方法(计数排序,选择排序,插入排序和冒泡排序)的复杂度均为O(n^2)。那有没有排序方法的复杂度是O(n)这个级别的呢?
还真有,最近发现了两种排序方法—箱子排序和基数排序复杂度都可以达到O(n)级别。并且基数排序是在箱子排序的基础之上改进的。

1.箱子排序

箱子排序的一般步骤:1.创建range(排序数据的范围)个箱子。2.将输入的无序数据结构逐个删除并插入到对应的箱子中。3.将每个非空箱子按序连接起来。
实现的C++代码如下:

#include "BinSort.h"

//学生的结构体
struct studentRecord{
   
    int score;
    string name;
};


//箱子排序,就是创建range个箱子,然后将n个数据填进到箱子中,最后将非空的箱子连接起来(range箱子的范围)
void binSort(chain<studentRecord>& theChain,int range){
   

    //第一步创建箱子
    chain<studentRecord> *bin;
    bin = new chain<studentRecord>[range+1];

    //第二步将n个数据放到箱子中去
    int size = theChain.size();//获得n的大小
    for (int j = 0; j < size; ++j) {
   

        studentRecord temp = theChain.get(0);
        theChain.erase(0);
        bin[temp.score].insert(0,temp);

    }

    //第三步将非空箱子连接起来
    for (int k = range; k >= 0 ; --k) {
   //从后面来保持稳定排序

        while (!bin[k].empty()){
   
            theChain.insert(0,bin[k].get(0));
            bin[k].erase(0);
        }

    }

    delete [] bin;

}

int main() {
   

    studentRecord student1,student2,student3,student4,student5;
    int studentNumbers = 5;

    student1.score = 98;
    student2.score = 100;
    student3.score = 93;
    student4.score = 22;
    student5.score = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值