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

    【基本思想】

      计数排序类似与桶排序,也是用空间换取了时间,计数排序要求数组必须在一个确定的区间内。

      过程:1. 首先找出数组的最大值和最小值;2. 遍历数组,以数字作为键,该数字出现的次数作为值插入哈希表中;3. 在最小值到最大值这个区间内遍历哈希表,将数字反向插入数组中。

    【算法复杂度】

      计数排序是一个稳定的排序算法。当输入的元素是 n 个 0到 k 之间的整数时,时间复杂度是O(n+k),空间复杂度也是O(n+k),其排序速度快于任何比较排序算法。当k不
    是很大并且序列比较集中时,计数排序是一个很有效的排序算法。

    【动图演示】

    【算法实现】

    /*
    ** 计数序算法的C++实现
    ** 假设:对N个数字进行升序排序
    ** 利用STL-HashMap的属性:
    **  1.当键不存在时,则新增,初始值默认为0
    **  2.当键不存在时,if条件判断的结果为false
    */
    void countingSort(vector<int>& seq){
        map<int,int> record;    // 定义桶
        int min = seq[0],max=seq[0]; 
        for(int k=1;k<seq.size();k++) { //找到最大值最小值
            if(seq[k]<min) min=seq[k];
            if(seq[k]>max) max=seq[k];
        }
        for(int i=0;i<seq.size();i++) record[seq[i]]++; // 将数字放入对应的桶中
        seq.clear();
        for(int j=min;j<=max;j++) if(record[j]) seq.insert(seq.end(),record[j],j); // 将桶中的数字重新插入到数组中
    }
  • 相关阅读:
    ioctl()函数详解
    傻孩子菜单框架
    高级套接口-(sendmsg和recvmsg)
    Linux内核Socket CAN中文文档
    第二节 信息系统服务管理
    第一节 信息化知识
    关系数据库标准语言SQL——概述
    SQL分组函数
    如何将web项目部署到weblogic
    范式
  • 原文地址:https://www.cnblogs.com/nkqlhqc/p/10805506.html
Copyright © 2011-2022 走看看