基数排序
2018-02-03 16:12
218 查看
给大家讲一下关于基数排序的东西
话不多说先上代码
#include <iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int num[100005];
int max_bit(int n)
{
int ma=num[1],mi=num[1];
for(int i=2;i<=n;i++)
{
ma=max(ma,num[i]);
mi=min(mi,num[i]);
}
int ma_len=0,mi_len=0;
while(ma)
{
ma=ma/10;
++ma_len;
}
while(mi)
{
mi=mi/10;
++mi_len;
}
return max(ma_len,mi_len);
}
void Collect(queue<int>*q)
{
int index=1;
for(int i=0;i<20;i++)
{
while(!q[i].empty())
{
num[index]=q[i].front();
index++;
q[i].pop();
}
}
}
void bin_sort(int n)
{
int len=max_bit(n);
queue<int> q[20];
int flag=1,in;
while(len)
{ flag=flag*10;
for(int i=1;i<=n;i++)
{
in=num[i]%flag/(flag/10)+10;
q[in].push(num[i]);
}
Collect(q);
--len;
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
bin_sort(n);
for(int i=1;i<=n;i++)
printf("%d%c",num[i],i==n?'\n':' ');
用max_bit找出待排序这些数中最大数的位数(便于确定循环次数)
然后按照最大位数逐位进行排序
那么怎么叫做逐位排呢
举个栗子-----567,123,131三个数排序
先按照个位数来排-----131,123,567
再按十位数排-----123,131,567
再按百位数排-----123,131,567
于是就排好了哦,具体用队列数组来实现,参见代码
顺便说一句,基数排序是时间复杂度最好的排序方式,只有线性阶。
话不多说先上代码
#include <iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int num[100005];
int max_bit(int n)
{
int ma=num[1],mi=num[1];
for(int i=2;i<=n;i++)
{
ma=max(ma,num[i]);
mi=min(mi,num[i]);
}
int ma_len=0,mi_len=0;
while(ma)
{
ma=ma/10;
++ma_len;
}
while(mi)
{
mi=mi/10;
++mi_len;
}
return max(ma_len,mi_len);
}
void Collect(queue<int>*q)
{
int index=1;
for(int i=0;i<20;i++)
{
while(!q[i].empty())
{
num[index]=q[i].front();
index++;
q[i].pop();
}
}
}
void bin_sort(int n)
{
int len=max_bit(n);
queue<int> q[20];
int flag=1,in;
while(len)
{ flag=flag*10;
for(int i=1;i<=n;i++)
{
in=num[i]%flag/(flag/10)+10;
q[in].push(num[i]);
}
Collect(q);
--len;
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
bin_sort(n);
for(int i=1;i<=n;i++)
printf("%d%c",num[i],i==n?'\n':' ');
用max_bit找出待排序这些数中最大数的位数(便于确定循环次数)
然后按照最大位数逐位进行排序
那么怎么叫做逐位排呢
举个栗子-----567,123,131三个数排序
先按照个位数来排-----131,123,567
再按十位数排-----123,131,567
再按百位数排-----123,131,567
于是就排好了哦,具体用队列数组来实现,参见代码
顺便说一句,基数排序是时间复杂度最好的排序方式,只有线性阶。
相关文章推荐
- 数据结构之基数排序
- 第十六周 -项目1 -算法验证 (7)归并排序 (8)基数排序
- 10-11-基数排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版
- 第16周项目1-验证算法(8)基数排序
- 使用队列对数组排列,基数排序
- 重温基数排序
- 一天一练之基数排序
- 经典排序算法 - 基数排序Radix sort
- 第十六周 项目1验证算法-基数排序
- Go语言写基数排序
- 排序算法-基数排序_基数排序
- 基数排序
- 链表应用之基数排序
- 【算法导论】第五课 线性排序(基数排序 计数排序)
- 基数排序
- 基数排序
- 经典排序算法 - 基数排序Radix sort
- 算法复习之基数排序
- 第十六周项目1-基数排序
- 内部排序之五:基数排序