基數排序

Posted lin88

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基數排序相关的知识,希望对你有一定的参考价值。

基數排序是一個複雜度突破了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;
}


                 

 

以上是关于基數排序的主要内容,如果未能解决你的问题,请参考以下文章

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

以下代码片段的时间复杂度是多少?

markdown 数组排序片段

Java排序算法 - 堆排序的代码

Realm和RecyclerView项目排序和自动ViewPager片段通信

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段