#include<iostream>
using namespace std;
void DistributionCountingSort(int*A,int len)
{
//1,find max and min
int max=A[0],min=A[0];
for(int i=0;i<len;i++)
{
max=(max>A[i])?max:A[i];
min=(min<A[i])?min:A[i];
}
int* temp=(int*)malloc(len*sizeof(int));
for(int i=0;i<len;i++)
temp[i]=0;
int* counter=(int*)malloc((max-min+1)*sizeof(int));
for(int i=0;i<(max-min+1);i++)
counter[i]=0;
for(int i=0;i<len;i++) //record the frequency of A[i]
{
counter[A[i]-min]++;
}
for(int i=1;i<=(max-min+1);i++) //record the distribution
counter[i]+=counter[i-1];
for(int i=0;i<len;i++) most important steps
{
int pose=counter[A[i]-min]-1;
temp[pose]=A[i];
counter[A[i]-min]--;
}
for(int i=0;i<len;i++)
A[i]=temp[i];
free(temp);
free(counter);
}
int main()
{
int A[20]={0};
int len=20;
for(int i=0;i<len;i++)
{
int x=(rand()%20)-10;
A[i]=x;
}
cout<<"before sorting"<<endl;
for(int i=0;i<len;i++)
cout<<i<<":"<<A[i]<<endl;
DistributionCountingSort(A,len);
cout<<"after sorting"<<endl;
for(int i=0;i<len;i++)
cout<<i<<":"<<A[i]<<endl;
return 0;
}
分布计数排序
最新推荐文章于 2021-12-19 16:58:05 发布