计数排序

来源:互联网 发布:用友t3数据库安装 编辑:程序博客网 时间:2024/06/07 03:00

所谓排序算法,无非就是把正确的元素放到正确的位置,计数排序就是计算相同key的元素各有多少个,然后根据出现的次数累加而获得最终的位置信息。计数排序不是基于比较的排序算法,时间效率为O(n),是最快的排序算法!但是计数排序有两个限制条件:

1、存在一个正整数K,使得数组里面的所有元素的key值都不大于K

2、key值都是非负整数。


以下代码是经过改进的计数排序代码:


void CountSort(int ages[], int length,int maxData){if (ages==NULL||length<=0){return;//输入不合法}int *timeOfAge = new int[maxData+1];  //哈希表,开辟空间for (int i = 0; i <= maxData;i++)     //必须初始化,因为后面是自增操作,不然结果不对!{timeOfAge[i] = 0;}int age;for (int i = 0; i < length;i++){age = ages[i];if (age<0||age>maxData) //不能大于最大年龄和小于最小年龄{throw new std::exception("age out of range");}++timeOfAge[age];}int index = 0;for (int i = 0; i <=maxData;i++)//常数次{for (int j = 0; j < timeOfAge[i];j++)//年龄为i的个数为timeOfAge[i]{ages[index] = i;index++;}}delete[] timeOfAge;//释放空间}



通过以上代码可以发现:计数排序的时间复杂度是以牺牲辅助存储空间为代价的。所以如果面试官要求实现一个排序算法,那么应聘者一定要问清楚这个排序应用的环境是什么、有哪些约束。如果不允许开辟额外的存储空间或者输入的值中存在负数,那就不能使用计数排序!


0 0
原创粉丝点击