基數排序
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注入(代码片段
Realm和RecyclerView项目排序和自动ViewPager片段通信
LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段