美文网首页
计数排序

计数排序

作者: 土人徐 | 来源:发表于2017-04-18 21:09 被阅读0次

    1.计数排序特点

    1.一般输入的关键字都在0到k区间内的一个整数,其中k为某个整数;
    2.当输入的元素个数为n时,排序的时间复杂度为O(n);
    3.计数排序需要额外的空间,k越大需要的额外空间越大,因为需要k长度的数组;

    2.计数排序介绍

    计数排序的基本思路:对每一个输入元素x,确定小于x的元素个数(假设为a),那么x可放到输出数组的a位置上。例如,如果有10个元素小于x,则x就应该放在第11个输出的位置上。

    3.计数排序的伪代码

    假设输入是一个数组A [0..n-1],A.length = n。需要另外两个数组:B[0..n-1]存放排序后输出,C[0..k]提供计数使用。

    COUNTING-SORT(A,B,k)
    let C[0,k] to be a new array
    // 重置C[0..k]个元素为0
    for i = 0 to k  
        C[i] = 0;
    // A[0..n-1]数组中A[j]有几个计数在C[A[j]]上
    for j = 0 to A.length -1
        C[A[j]] = C[A[j]] + 1
    // 计算A[0..n-1]中比A[j]小的个数,即C[0..k]中比A[j]下标小的计数之和(这里需要理解一下,
    //比如A[10] = 30,那么C[0..29]是对应A[0..n-1]数组中0到29的个数,0到29可能有些数没有,对应的个数为0)
    for i = 1 to k
        C[i] = C[i] + C[i - 1]      // C[i]即为i = A[x]的小于等于i的个数
    // 把A[0..n-1]排序输出到B[0..n-1]
    for j = A.length-1 downto 0
        count = C[A[j]]
        B[count -1] = A[j]
        C[A[j]] = C[A[j]] - 1       // 把A[j]的个数减1
    

    图解步骤如下:

    算法-计数排序1.png

    相关文章

      网友评论

          本文标题:计数排序

          本文链接:https://www.haomeiwen.com/subject/wkuqzttx.html