计数排序

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. 完整的例子请参考 链接

以上是关于计数排序的主要内容,如果未能解决你的问题,请参考以下文章

算法-java代码实现计数排序

计数排序代码

计数排序Java代码实现

[leetcode]排序算法(冒泡排序,选择排序,插入排序,快速排序,计数排序)

计数排序再思考——从2020年1月第16题谈起

计数排序就是这么容易