计数排序不需要进行比较(//说实话,看到这句话的时候,我也是挺懵的,不比较怎么进行排序啊!),所以计数排序是有一定限制的。首先,计数排序必须是整数,范围为[0,max](//个人觉得这里的max其实也隐含了一个比较的过程)。想法是这样的,数组中的元素按大小排前面有几个,就把该元素放在新数组相应的位置。
计数排序的操作是这样的:
已知原数组的大小和最大的数,比如,最大的数是12。
然后建立一个计数数组,初始化元素为0,其大小为原数组的最大的数,比如说 int count[12]。然后,对原数组中的数进行统计,如果原数组中有这个元素就在计数数组中+1,比如原数组中有2, 4,4,5, 5, 5,那么count[2]=1,count[4]=2,count[5]=3。
下一步,求和,count[i]=count[i]+count[i-1],遍历后,count数组中元素表示原数组中<=i 的元素的个数。
最后一步,将元素放入新数组中相应的位置,根据count数组。
废话不说,上代码://需要注意的是,sorted[count[original[i]]-1]=orignal[i] ,这里需要-1,比如说original[0]=0且只有一个,那么count[0]=1,但是在新数组中还是要放在sorted[0]的位置,就是说差一个。
#include <iostream>
using namespace std;
void showArray(int *a,int len)
{
cout<<endl;
for(int i=0;i<len;i++)
cout<<a[i]<<" ";
cout<<endl;
}
int findMax(int *a,int len)
{
int max=a[0];
for(int i=0;i<len;i++)
{
if(a[i]>max)
max=a[i];
}
return max;
}
void countingSort(int *original,int *sorted,int len,int max)
{
int count[max+1];
for(int i=0;i<max+1;i++)
count[i]=0; //initalized array count
for(int j=0;j<len;j++)
count[original[j]]++; //count origianl array
for(int i=1;i<max+1;i++)
count[i]=count[i]+count[i-1]; //sum
for(int i=len-1;i>=0;i--)
{
sorted[count[original[i]]-1]=original[i];
count[original[i]]--;
}
}
int main()
{
int a[]={7,9,2,12,6,9,1,4},b[8];
showArray(a,8);
countingSort(a,b,8,findMax(a,8));
showArray(b,8);
return 0;
}