这三个是线性时间的排序算法,对排序的数据有一定要求。
计数排序:适合排序指定区间内的整数型,并且跨度不能太大。
简单来说就是开辟一个count[]数组,count[i]表示整数型i出现的次数。
然后从头到尾收集起来即可。
#include<iostream>
#include<vector>
#include<algorithm>
#include<ctime>
using namespace std;
const int MAX=0x7fffffff;
void countingsort(vector<int> &arr)
{
int amin=MAX,amax=-MAX;
for(int i=0;i<arr.size();i++)
{
amin=min(amin,arr[i]);
amax=max(amax,arr[i]);
}
vector<int> count(amax-amin+1,0);
for(int i=0;i<arr.size();i++)
count[arr[i]-amin]++;
int c=0;
for(int i=0;i<count.size();i++)
{
for(int j=0;j<count[i];j++)
arr[c++]=(i+amin);
}
}
int main()
{
srand(time(NULL));
int n;
cin>>n;
vector<int> arr(n);
for(int i=0;i<n;i++)
arr[i]=rand()-15000;//有随机负数
countingsort(arr);
for(int i=0;i<n;i++)
cout<<arr[i]<<" ";
return 0;
}
基数排序:要求待排序的数值型为正整数,然后以每个数的第一个为标准,按标准从小到大排序,再以第二位数为标准...
如此下去数组就有序了。
#include<iostream>
#include<vector>
#include<ctime>
using namespace std;
int getbitnum(int num,int wb)
{
while(wb>0)
{
num/=10;
wb--;
}
return num%10;
}
void distributionsort(vector<int> &arr)
{
vector< vector<int> > dis(10);
int wb=0;
while(dis[0].size()<arr.size())
{
for(int i=0;i<10;i++) dis[i].clear();
for(int i=0;i<arr.size();i++)
dis[getbitnum(arr[i],wb)].push_back(arr[i]);
wb++;
int c=0;
for(int i=0;i<dis.size();i++)
for(int j=0;j<dis[i].size();j++)
arr[c++]=dis[i][j];
}
}
int main()
{
srand(time(NULL));
int n;
cin>>n;
vector<int> arr(n);
for(int i=0;i<n;i++)
arr[i]=rand();
distributionsort(arr);
for(int i=0;i<n;i++)
cout<<arr[i]<<" ";
return 0;
}
桶排序:这个感觉就是分一下桶,还是要借助别的排序算法。
我的是按数据范围分为n个桶,对每个桶进行计数排序。
#include<iostream>
#include<vector>
#include<algorithm>
#include<ctime>
using namespace std;
const int MAX=0x7fffffff;
void countingsort(vector<int> &bucket)
{
int amin=MAX,amax=-MAX;
for(int i=0;i<bucket.size();i++)
{
amin=min(amin,bucket[i]);
amax=max(amax,bucket[i]);
}
vector<int> count(amax-amin+1,0);
for(int i=0;i<bucket.size();i++)
count[bucket[i]-amin]++;
int c=0;
for(int i=0;i<count.size();i++)
for(int j=0;j<count[i];j++)
bucket[c++]=(i+amin);
}
void bucketsort(vector<int> &arr)
{
int amin=MAX,amax=-MAX;
for(int i=0;i<arr.size();i++)
{
amin=min(amin,arr[i]);
amax=max(amax,arr[i]);
}
vector< vector<int> >coll(100);
double L=(amax-amin)/99.0;
for(int i=0;i<arr.size();i++)
coll[int((arr[i]-amin)/L)].push_back(arr[i]);
for(int i=0;i<coll.size();i++)
countingsort(coll[i]);
int c=0;
for(int i=0;i<coll.size();i++)
for(int j=0;j<coll[i].size();j++)
arr[c++]=coll[i][j];
}
int main()
{
srand(time(NULL));
int n;
cin>>n;
vector<int> arr(n);
for(int i=0;i<n;i++)
arr[i]=rand();
bucketsort(arr);
for(int i=0;i<n;i++)
cout<<arr[i]<<" ";
return 0;
}