基數排序

基數排序是一個複雜度突破了O(nlogn)的排序算法

優點:快

缺點:需要額外空間一倍,只是用與整數

原理:一次按照數據的最低位,次底位……最高位進行排序,利用桶子來進行。

見代碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5;

inline int getdigit(int *v,int n)//獲取數據中最大的位數
{
    int d=1,bas=10;
    for(int i=0;i<n;++i)
    {
        while(v[i]>=bas)
        {
            ++d;
            bas*=10;
        }
    }
    return d;
}

void LSD(int *v,int n)
{
    int bas=1;
    int d=getdigit(v,n);
    int *temp=new int[n];//臨時數組
    while(d--)
    {
        int cnt[10]={0};
        int id;
        for(int i=0;i<n;++i)//求出每個桶的大小
        {
             id=v[i]/bas%10;
             cnt[id]++;
        }
        int st[10]={0};//
        for(int i=1;i<10;++i)//在臨時數組上分配位置
            st[i]=st[i-1]+cnt[i-1];
            
        for(int i=0;i<n;++i)//把數據按照桶子的記錄,搬到臨時數組
        {
            id=v[i]/bas%10;
            temp[st[id]++]=v[i];
        }
        memcpy(v,temp,n*sizeof(int));//搬回原數組
        bas*=10;
    }
    delete [] temp;
}


int main()
{
    int a[10];
    srand(time(0));
    for(int i=0;i<10;++i)
        a[i]=rand()%20+1;
    for(int &x:a)
        cout<<x<<" ";
    cout<<endl;
    LSD(a,10);
    for(int &x:a)
        cout<<x<<" ";
    cout<<endl;
}


                 

 

posted @ 2018-12-05 22:01  Lin88  阅读(113)  评论(0编辑  收藏  举报