码迷,mamicode.com
首页 > 编程语言 > 详细

计数排序

时间:2018-10-09 00:29:56      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:时间复杂度   不可   col   get   p12   初始化   获取   bsp   范围   

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

计数排序

标签:时间复杂度   不可   col   get   p12   初始化   获取   bsp   范围   

原文地址:https://www.cnblogs.com/zhugaopeng/p/9757940.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!