第八章线形时间排序之“计数法排序COUNTING-SORT”

来源:互联网 发布:文笔好的宫廷小说知乎 编辑:程序博客网 时间:2024/04/29 14:56

这个方法很牛逼,这个排序方法不再像前面那些排序方法一样根据比较来进行。

时间复杂度为O(k+n+k+n+n)=O(n),当k=O(n)时,可以保证时间复杂度为O(n),就可以用计数法来进行排序了。

这个方法的一个前提是必须要知道要排序的数组中元素的取值范围。

#include <string.h>#include <time.h>#define BUFFER_SIZE 10void CountingSort(int *a,int len,int k){//a[]中的数在0~k之间 int i=0;int c[k+1];int b[len+1];int tmp=0;for(i=0;i<=k;i++){//计数清零,复杂度O(k)c[i]=0;}for(i=1;i<=len;i++){//开始计数,复杂度O(n)c[a[i]]++;}for(i=1;i<=k;i++){//复杂度O(k)c[i]+=c[i-1];//c[i]中装的是小于等于i的数的个数 } for(i=len;i>0;i--){//按着计数来排序,复杂度O(n)。之所以从len到着来排序,是为了保持稳定性。tmp=a[i];b[c[tmp]]=tmp;c[tmp]--;}for(i=1;i<=len;i++){//把数组再复制回a中a[i]=b[i];}}int main(){int i=0;int a[BUFFER_SIZE+1]; //随机生成数组 srand((unsigned)time(NULL));for(i=1;i<=BUFFER_SIZE;i++){a[i]=rand()%(BUFFER_SIZE+1);} printf("随机生成的数组:\n");for(i=1;i<=BUFFER_SIZE;i++){printf("%d   ",a[i]);} printf("\n");CountingSort(a,BUFFER_SIZE,BUFFER_SIZE);printf("对数组进行计数排序:\n"); for(i=1;i<=BUFFER_SIZE;i++){printf("%d   ",a[i]);}system("pause");return 0;} 


原创粉丝点击