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

    计数排序是一个不需要比较的,类似于桶排序的线性时间排序算法。该算法是对已知数量范围的数组进行排序。其时间复杂度为O(n),适用于小范围集合的排序。

    比如一千万个整数,每个数的范围在[-1000,1000],怎样对他们排序最快?答案应该是计数排序。因为时间复杂度为o(n),线性复杂度。

    (1)基本思想:

    一组数在排序之前先统计这组数中小于这个数的个数,则可以确定这个数的位置,即每个数都知道自己该在的位置,排序自然就快了。

    (2)方法:

    首先需要三个数组,第一个数组记录要排序的数列,第二个数组要记录比某个数小的其他数字的个数,所以第二个数组的大小应当为K(数列中最大数的大小),第三个数组记录排序好的数组。

     接着需要确定数组最大值并确定B数组的大小。并对每个数由小到大的记录数列中每个数的出现次数。因为是有小到大通过出现次数可以通过前面的所有数的出现次数来确定比这个数小的数的个数,从而确定其位置。

    对于重复的数,每排好一个数则对其位置数进行减减操作,以此对完成其余相同的数字进行排位。

    (3)代码:

    void countsort(int *a,int *sort,int length)
    {
        int max=a[0];
        for(int i=0;i<length;i++)
        {
            max=a[i]>max?a[i]:max;
        }
        int *count= new int[max+1];
        memset(count,0,(max+1)*sizeof(int));
        for(int i=0;i<length;i++)
        {
            count[a[i]]++;
        }
        for(int i=1;i<max+1;i++)
            count[i]+=count[i-1];
        for(int i=length;i>0;i--)
        {
            sort[count[a[i-1]]-1]=a[i-1];
            count[a[i-1]]--;
        }
        delete count;
    }
  • 相关阅读:
    基于Servlet+JSP+JavaBean开发
    jsp&servlet报红线javax.servlet.jsp.XXXX cannot be resolved to a type类似错误解决办法
    java为什么要定义接口等相关解释
    SpringMVC的注解方式
    MyBatis映射
    hibernate、JDBC 实现 oracle ID 的自动增加 功能
    SSH框架的JSP网站添加数据为什么没反应
    又考完一科 又过完一年
    一个招标书文件的需求分析
    《需求分析》读后感之二
  • 原文地址:https://www.cnblogs.com/mini-coconut/p/9392125.html
Copyright © 2011-2022 走看看