您的位置:首页 > 其它

基数排序

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

于是就排好了哦,具体用队列数组来实现,参见代码

顺便说一句,基数排序是时间复杂度最好的排序方式,只有线性阶。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: