您的位置:首页 > 其它

桶排序(基数排序)

2017-01-09 12:41 141 查看

桶排序

先说一下桶排序,桶排序应用于每个元素的排序码由一个数据项组成,则准备N个箱子(N由数据项的取值范围确定,例如排序码为 Digit 数字0-9,则N=10),遍历数据表,根据将每个元素的排序码放到相应的桶内。然后再按顺序从 0-N号桶 并且FIFO(先进先出)的规则将元素从桶中取出,得出的元素序列已经是有序的了。



就如上图,从桶出取出元素时,已经是排好序的并且是稳定的排序算法。时间复杂度为O(n)

基数排序

我们可以发现桶排序有个缺点,就是当元素的排序码由多个数据项组成的时候便不适用了,所以我们对桶排序做出修改,将数按照某个基数分解成数字。例如去基数为10将十进制数756分解数数字7、5、6,然后按这些数字从低位到高位进行排序LSD(相反也可以,即MSD)。下面给出基数排序的代码。

#include<iostream>
#include<cmath>
#include<queue>
using namespace std;

//取得数第k位的数字(k=1为个位,以此类推)
int getDigit(int n,int k)
{
return (n%(int)pow(10.0,k))/pow(10.0,k-1);
}

template<class T>
void RadixSort(dataList& L,int d)
{
queue<T> Q[10];//10个桶
for(int i=1;i<=d;++i)//d为数的最高位,从最低位开始取至最高位
{
//遍历数据表根据将每个元素第i位排序码放进适当的桶中
for(int k=0;k<L.size();++k)
{
pos = getDigit(L[k],i);
Q[pos].push_back(L[k]);
}

int count = 0;
//将所有桶中的数据取出来,按顺序放在数据表中
for(int k=0;k<10;++k)
while(Q[k].empty() == false)
{
L[count++] = Q[k].front();
Q.pop_front();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息