zoukankan      html  css  js  c++  java
  • 计数排序

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

  • 相关阅读:
    day 06小结
    day 05小结
    day 05作业
    day 04作业
    day 03作业
    今日小结
    day 02小结
    hdu 4608 I-number(13多校#1 ,1009)
    zoj 2316 Matrix Multiplication(D)
    zoj 2316 Matrix Multiplication(2-D)
  • 原文地址:https://www.cnblogs.com/zhugaopeng/p/9757940.html
Copyright © 2011-2022 走看看