您的位置:首页 > 其它

排序(二)非比较排序

2017-01-02 22:48 120 查看
七大排序那篇博客讲的排序都是比较排序,这篇博客要写的内容是不需要通过比较就可以排序。

1.计数排序

解题思路:开辟一块数组,范围为最大数减去最小数,用这个数减去最小值的差,对应的下标来统计,刚开始都初始化为0,如果有就把新开辟中的值++,最后按顺序遍历新开辟的数组,把值放到原数组中,就可以打到排序的目的。

void CountSort(int* a,size_t n)
{
int max=a[0];
int min=a[0];
for(size_t i=0;i<n;++i)
{
if(a[i]>max)
max=a[i];
if(a[i]<min)
min=a[i];
}
int range=max-min+1;
int* tmp=new int[range];
memset(tmp,0,sizeof(int)*range);
for(size_t i=0;i<n;++i)
{
tmp[a[i]-min]++;
}
int index=0;
for(size_t i=0;i<range;++i)
{
while(tmp[i]--)
{
a[index++]=i+min;
}
}
}

2.基数排序

int GetMaxDigit(int* a,size_t n)
{
int max=1;
int base=10;
for(size_t i=0;i<n;++i)
{
while(a[i]/base)
{
max++;
base*=10;
}
}
return max;
}
void LSD(int* a,size_t n)
{
int count[10]={0}; //统计出现的次数
int start[10]={0}; //第一次出现的位置
int* tmp=new int
;

int max= GetMaxDigit(a,n);
int base=1;
for(size_t i=0;i<max;++i)
{
for(size_t i=0;i<n;++i)
{
count[(a[i]/base)%10]++;
}

start[0]=0;
for(size_t i=1;i<10;++i)
{
start[i]=count[i-1]+start[i-1];
}

//排序
for(size_t i=0;i<n;++i)
{
int num=(a[i]/base)%10;
tmp[start[num]++]=a[i];
}
memcpy(a,tmp,sizeof(int)*n);
base*=10;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  非比较排序