计数排序

来源:互联网 发布:java工程反编译 编辑:程序博客网 时间:2024/06/05 06:22

     计数排序是一种费比较的排序算法,它的思想其实很简单,就是先开辟一块空间用来存放数据出现的次数,然后就要统计出数据出现的次数,并将其放在对应的位置下标上,最后我们可以根据统计的次数依次还原出来就有序了,如下图分析:


代码实现:

void CountSort(int* a,int n){assert(a);int max=a[0];int min=a[0];//1.先统计数据中的最大值和最小值,然后确定范围for(int i=0;i<n;++i){if(a[i]>max)max=a[i];if(a[i]<min)min=a[i];}int range=max-min+1;int* count=new int[range];  //用来存放数据出现的次数memset(count,0,sizeof(int)*range);//2.遍历数据放在对应的位置for(int i=0;i<n;++i){count[a[i]-min]++;}//3.将数据按统计的次数依次还原int index=0;for(int i=0;i<range;++i){while(count[i]--){a[index++]=i+min;}}delete[] count;}

计数排序,在数据范围比较大或是数据太过分散的时候占用空间就很大,这种情况就不太适用,而且只能对无符号数进行排序(没有比较),但是它有一个很明显的优势是:在数据范围较集中时,排序效率是相当高的。

时间复杂度为O(N+范围),空间复杂度为O(范围)。


0 0
原创粉丝点击