在基数排序之前,我们先来看一下计数排序:
计数排序是一个非基于比较的排序。它的优势在于对一定范围内的整数排序时,它的时间复杂度为O(n+k)(其中k为整数的范围),快于任何比较排序算法。
计数排序的基本思想就是对每一个输入元素x,确定出小于x的元素的元素的个数,有了这一信息就可以把x归位了。例如,如果数组有6个元素比x小,那么x归为后几位数组中的第7个元素。
实现代码如下:
/*
Author:Ibsen
Data:2015.12.22
*/
//计数排序:时间O(n+k),空间O(n),稳定
#include <iostream>
#include <cstdlib>
using namespace std;
const int maxn=1000;
int A[]={2,4,6,8,0,9,7,5,3,1},n=10,B[maxn],C[maxn];
void Counting_Sort(int A[],int B[],int n,int k)
{//对含有n个元素的数组A进行计数排序,排序结果放在数组B中,保证A中元素最大不超过k
for(int i=0;i<=k;i++) C[i]=0;
for(int i=0;i<n;i++) C[ A[i] ]++; //C[i]包含等于i的元素的个数
for(int i=1;i<=k;i++) C[i]+=C[i-1]; //C[i]包含小于等于i的元素的个数
for(int i=n-1;i>=0;i--) B[ --C[ A[i] ] ]=A[i];
}
void Display(int B[],int n)
{
for(int i=0;i<n;i++)
cout<<B[i]<<" ";
cout<<endl;
}
int main()
{
Counting_Sort(A,B,n,10);
Display(B,n);
return 0;
}
计数排序的一个重要性质就是它是稳定的:具有相同值的元素在输出数组中的相对次序与他们在输入数组中的相对次序相同。
计数排序可以作为基数排序的一个子过程。
基数排序可以对有多个关键字的元素进行排序。
基数排序首先对所有元素按最低有效位(即“最低位优先(LSD)”也可以按"最高位优先(MSD)")进行排序,然后按次低有效位排序,直到把所有关键字都进行排序。