计数排序
时间复杂度:
举例:假设我们有如下员工需要按照身高排序
a | b | c | d | e |
150 | 167 | 176 | 149 | 160 |
就正常而言,人类的正常身高不会超过300cm,因此我们可以生成300个桶,每个桶代表相应的身高,将每个员工分别放在桶中,然后依次倒出,便得到排序后的序列。
#include<iostream>
#include<cstdlib>
using namespace std;
class CountingSort {
public:
int* countingSort(int* A, int n)
{
int i,j,min,max;
for(i=1,min=max=A[0];i<n;i++)
{
if(A[i]<=min)
min=A[i];
if(A[i]>max)
max=A[i];
}
int *counts=(int *)calloc(max-min+1,sizeof(int));
if(!counts)
exit(-1);
for(i=0;i<n;i++)
counts[A[i]-min]++;
for(i=0,j=0;i<max-min+1;i++)
while(counts[i])
{
A[j]=i+min;
counts[i]--;
j++;
}
free(counts);
counts=NULL;
return A;
}
};
int main()
{
int arr[]={150, 167, 176, 149, 160};
CountingSort a;
a.countingSort(arr,5);
for(int i=0;i<5;i++)
cout<<arr[i]<<" ";
cout<<endl;
return 0;
}
基数排序
时间复杂度:
举例:假设有如下序列需要排序
015, 021, 084,012, 101, 079
假设所输入的数字都是十进制数,我们生成0-9十个桶,将数字统一长度,不足补0,然后分别对位排序。
- 按照个位排序:021, 101, 012, 084, 015, 079
- 按照十位排序:101, 015, 012, 021, 079, 084
- 按照百位排序:015, 012, 021, 079, 084, 101
注意:桶倒出的次序是按照先进先出的原则。
#include<iostream>
#include<math.h>
using namespace std;
#define N 10
class RadixSort
{
public:
int* radixSort(int* A, int n,int radix)
{
int temp[10][N]={0},order[10]={0};
int m=(int)pow((double)10,radix-1),base=1;
while(base<=m)
{
int i,k;
for(i=0;i<n;i++)
{
int lsd=(A[i]/base)%10;
temp[lsd][order[lsd]]=A[i];
order[lsd]++;
}
for(i=0,k=0;i<10;i++)
{
if(order[i])
{
int j;
for(j=0;j<order[i];j++,k++)
A[k]=temp[i][j];
}
order[i]=0;
}
base*=10;
}
return A;
}
};
int main()
{
int arr[]={101, 21, 12, 84, 15, 79};
RadixSort a;
a.radixSort(arr,6,10);
for(int i=0;i<6;i++)
cout<<arr[i]<<" ";
cout<<endl;
return 0;
}