之前有一个关于排序方法的总结详见该篇博文在总结中四种排序方法(计数排序,选择排序,插入排序和冒泡排序)的复杂度均为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 =