一个简单有趣的算法
基数排序
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。
由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
实现
基数排序的方式可以采用 LSD(Least significant digital)或 MSD(Most significant digital),LSD 的排序方式由键值的最右边开始,而 MSD 则相反,由键值的最左边开始。
简单按数字排序来说: 我们可以先按个位排好序,然后百位排序,千位排序…等等,直到最高位
最后得到的就是排好序的序列
一张图片足以解释
代码:
#include <bits/stdc++.h>
using namespace std;
int getMaxNum(int *a,int n)//获得最大数字
{
int maxNum=0;//
for(int i=0;i<n;i++)
{
maxNum=max(maxNum,a[i]);
}
return maxNum;
}
int getSortTimes(int maxNum)//需要排序的次数
{
int times;
while(maxNum)
{
times++;
maxNum/=10;
}
return times;
}
void bucketSort(int *a,int n,int t)
{
//初始化桶,一个二维数组
vector<int> bucket[10];
int index;
for(int i=0;i<n;i++)
{
index=(a[i]/t)%10;
bucket[index].push_back(a[i]);
}
//把桶中的数据,返回给原来的数组中
int k=0;
for(int i=0;i<10;i++)
{
for(int j=0;j<bucket[i].size();j++)
{
a[k++]=bucket[i][j];
}
}
}
void RadixSort(int *a,int n)
{
int maxNum=getMaxNum(a,n);
int times=getSortTimes(maxNum);
int t=1;
for(int i=0;i<times;i++)
{
if(i!=0)t*=10;
bucketSort(a,n,t);
}
}
int main()
{
int a[6]={6,10,99,125,3,78};
int n=6;
RadixSort(a,n);
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
结果: