计数排序
Posted zhugaopeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计数排序相关的知识,希望对你有一定的参考价值。
1. 何为计数排序?
计数排序是一种基于数组下标,统计数组值的排序方法。
计数排序适用于要排序的数组取值范围较小的情况。合适的情况下,计数排序的时间复杂度小于n*log(n)
2. 计数排序的第一步:确定取值范围,避免空间浪费。
获取最大最小值的方法:
1 /* 2 * 先找出最大最小值,确定取值范围 3 */ 4 int minNum = arr[0]; 5 int maxNum = arr[0]; 6 for (int i = 0; i != n; ++i) 7 { 8 if (minNum > arr[i]) 9 { 10 minNum = arr[i]; 11 } 12 if (maxNum < arr[i]) 13 { 14 maxNum = arr[i]; 15 } 16 }
3. 创建临时对象,存放遍历结果
1 int *dest = new int[maxNum - minNum + 1](); 2 // 最后的括号不可缺少,表示对数组进行初始化 3 for (int i = 0; i != n; ++i) 4 { 5 // 当前下标的数组值 减去 最小值才是临时数组的下标值 6 ++dest[arr[i] - minNum]; 7 }
4. 最后一步:输出完整的结果
1 for (int i = minNum; i != maxNum + 1; ++i) 2 { 3 // 临时数组的值是几,就输出几遍 4 for (int j = 0; j != dest[i - minNum]; ++j) 5 { 6 cout << i << ‘ ‘; 7 } 8 } 9 cout << endl;
5. 如果临时数组是new创建的,记得要delete。也可以使用vector,避免new/delete操作。
delete []dest;
6. 计数排序适用范围
计数排序适用于要排序的值范围不大的情况下。假如取值从1到10000,创建大小为10000的数组也是一笔不小的空间开销。
在取值范围不大的情况下,计数排序的时间复杂度小于n * log(n)
7. 完整的例子请参考 链接
以上是关于计数排序的主要内容,如果未能解决你的问题,请参考以下文章