基数排序正常是用链表,但是new delete 反复确实效率低下
底下这个是用的c++的列队,底层效率不高
但若用游标链表可以少了new跟delete的代价,只要复制一份待排序数内存即可
但有更高效的实现方式,就是比如30个数随机分布用概率论可以算的理论上基数10的话每桶是3,
<span style="white-space:pre"> </span>超出的部分用新的桶数组去排序,6-9-12总有完结的时候,比较优
真正的桶式排序 却是超大重复数的 小区间统计,比如高考,无太多意义,就是统计而已
慢慢觉得 写框架也好,写数据结构也好,不是一个例子可以抄袭,不是学会树上的几种结构就OK,
主要数据结构学的个人觉得还是手上的实现能力,,,具体工程需要具体设计优化,当然也需要证明实现的正确性,甚至空间时间的界的明确证明,
<span style="white-space:pre"> </span>
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<deque>
#define random(x) (rand()%x)
using namespace std;
/*=============================================
1.有30个随机数,用随机数初始化数组;
3.需要1桶数组deque<int> bucket[10],每桶一个队列,
4.以基数10桶排,弄个求得位大小函数getPerDigit();
依次遍历4次
依照位大小,全部放桶里
每桶按顺序复制到原始数组,供读取继续
==============================================*/
void baseSort(int*ia){
int getPerDigit(int digit,int ival);
deque<int> bucket[10];
for(int dgt=1;dgt!=5;++dgt)
{//总遍历4次,即4个位数
cout<<"\n digit: "<<dgt<<"\n ";
for(int x=0;x!=30;x++)
{
int tmp=getPerDigit(dgt,ia[x]);
bucket[tmp].push_back(ia[x]);
}//比如个位数,全放桶里完毕
//接着遍历桶放到数组
int i=0;
for(int x=0;x!=10;)
{
// if(i==30)//虽然多余不会越界
// break;
while(!bucket[x].empty())
{//某一桶依次弄空方数组里
ia[i]=bucket[x].front();
cout<<ia[i++]<<",";
bucket[x].pop_front();
}
++x;//下一桶
}//复制到原来数组,覆盖完毕
//接着弄下一位高位++digit
}
}
int* initialize(){
int *ia=new int[30];
srand((int)time(0));
for(int x=0;x!=30;x++)
ia[x]=random(9999);
return ia;
}
int getPerDigit(int digit,int ival){//digit是3,即是百位树
int base=1;
while(--digit!=0)
base*=10;//获得100
int temp=ival/base;
return temp%10;//超出位数返回0
}
int main(){
int* ia=initialize();
cout<<"baseSort\n ";
baseSort(ia);
cout<<"\n\nbaseSort,it,, succeed!\n ";
for(int x=0;x!=30;x++){
cout<<ia[x]<<" ";
}
puts("\n\n");
return system("pause");
}