您的位置:首页 > 其它

无聊时总结总结算法之09基数排序

2016-02-19 15:00 162 查看
##
基数排序 ##

基数排序是非比较排序算法,算法的时间复杂度是O(n)。

基数排序的主要思路是,将所有待比较数值(注意,必须是正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始, 依次进行一次稳定排序,这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

比如这样一个数列排序:
342 ,58, 576, 356, 以下描述演示了具体的排序过程(红色字体表示正在排序的数位)

第一次排序(个位):

3
4 2

5
7 6

3
5 6

0
5 8

第二次排序(十位):

342

356

05
8

57
6

第三次排序(百位):

05
8

3
4 2

3
5 6

5
7 6

结果:
58 342 356 576

#include<iostream>
using namespace std;
#include <vector>
int data[10]={73, 22, 93, 43, 55, 14, 28, 65, 39, 81};
int tmp[10];
int count[10];
int maxbit(int data[],int n)
{
int d=1;
for(int i=0;i<n;i++)
{
int c=1;
int p=data[i];
while(p/10)
{
p=p/10;
c++;
}
if(c>d)
d=c;
}
return d;
}

void RadixSort(int data[],int n)
{
int d=maxbit(data,n);
int r=1;
for(int i=0;i<d;i++)
{

for(int i=0;i<10;i++)//装桶之前要先清桶
count[i]=0;
for(i=0;i<n;i++) //记录每个桶的记录数
{
int k=data[i]/r;
int q=k%10;
count[q]++;
}
for(i=1;i<10;i++)//计算位置
{
count[i]+=count[i-1];
//cout<<count[i]<<" ";
}
for(int j=n-1;j>=0;j--)
{
int p=data[j]/r;
int s=p%10;
tmp[count[s]-1]=data[j];
count[s]--;
//cout<<data[j]<<" ";
}
for(i=0;i<n;i++)
{
data[i]=tmp[i];
//cout<<tmp[i]<<" ";
}
//    cout<<endl;
r=r*10;

}

}
int main()
{
cout<<"基数排序c++实现"<<endl;
//cout<<maxbit(data,10)<<endl;
cout<<"排序之前的数值:";
for(int i=0;i<10;i++)
cout<<data[i]<<" ";
cout<<endl;
RadixSort(data,10);
cout<<"排序之前的数值:";
for(int i=0;i<10;i++)
cout<<data[i]<<" ";
cout<<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: