计数排序假设n个输入元素中的每个都是介于0道k之间的整数,此处k为某个整数。当k=O(n)时,基数排序的运行时间为O(n).
计数排序的基本思想就是对每一个输入元素x,确定出小于x的元素个数。有了这一信息,就可以把想直接放到他最终输出数组中的位置上。
/******************************************************************/
/* the program just to show Counting Sort */
/* Auther:SaoNian */
/* Time:2012/11/14 */
/******************************************************************/
#include <iomanip.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int * generateArray(int n,int k);//generate an unsorted array with length n
void showArray(int *a,int n);
void CountingSort(int *a,int n,int k);
int main()
{
int n,k;
cout<<"Please input the length of Array:";
cin>>n;
cout<<"Please input the of range the Number(k<=n):";
cin>>k;
int * arr=generateArray(n,k);
cout<<"the unsort Array:"<<endl;
showArray(arr,n);
CountingSort(arr,n,k);
cout<<"now we Sort it:"<<endl;
showArray(arr,n);
return 0;
}
void CountingSort(int *a,int n,int k)
{
int * c=new int[k+1];
int * b=new int[n+1];
int i;
for (i=0;i<=k;i++)
{
c[i]=0;
}
//记录大小为a[i]的元素的个数
for(i=1;i<=n;i++)
{
c[a[i]]++;
}
for (i=1;i<=k;i++)
{
c[i]=c[i]+c[i-1];
}
for (int j=n;j>=1;j--)
{
b[c[a[j]]]=a[j];
c[a[j]]--;
}
for(i=1;i<=n;i++)
a[i]=b[i];
}
int * generateArray(int n,int k)
{
int i;
int * arr=new int[n+1];
srand((int)time(NULL));
for(i=1;i<=n;i++)
{
arr[i]=rand()%k;
}
return arr;
}
void showArray(int *a,int n)
{
int i=1;
for(;i<=n;i++)
{
cout<<setw(4)<<a[i];
if(i%10==0)
{
cout<<endl;
}
}
}