排序(二)非比较排序
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;
}
}
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;
}
}
相关文章推荐
- Js比较对Object类型进行排序
- 数组排序方法的性能比较(2):Array.Sort<T>实现分析
- 利用比较接口实现List中的对象排序
- (转)各种排序比较 直观动画
- Java中的排序比较方法
- 关于“主键-次键”排序的三种方法比较。
- python插入排序和sort时间比较
- 艾伟_转载:数组排序方法的性能比较(上):注意事项及试验
- 经典排序 之 几种排序比较
- hive中排序和聚集比较
- 为什么说任何基于比较的算法将 5 个元素排序都需要 7 次?
- java数组类Arrays:比较,填充,排序
- 各种排序方法的性能比较
- 比较,排序,搜索字符串对象( Comparing, Sorting, and Searching String Objects )CFString
- 对象的比较与排序(三):实现IComparable<T>和IComparer<T>泛型接口
- 我比较喜欢的两种排序方法(冒泡排序、选择排序)
- 排序基础之非比较的计数排序、桶排序、基数排序(Java实现)
- List泛型自定义类型排序和大小比较 java版
- 01串排序。自定义比较仿函数
- 6种比较排序和决策树