码迷,mamicode.com
首页 > 编程语言 > 详细

基數排序

时间:2018-12-05 22:31:37      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:nlog   mem   利用   clu   ++i   style   return   srand   cout   

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


                 

 

基數排序

标签:nlog   mem   利用   clu   ++i   style   return   srand   cout   

原文地址:https://www.cnblogs.com/Lin88/p/10073736.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!