`
zheyiw
  • 浏览: 999836 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

计数排序

阅读更多
计数排序(Counting Sort)


  计数排序用到一个额外的计数数组C,根据数组C来将原数组A中的元素排到正确的位置。

  通俗地理解,例如有10个年龄不同的人,假如统计出有8个人的年龄不比小明大(即小于等于小明的年龄,这里也包括了小明),那么小明的年龄就排在第8位,通过这种思想可以确定每个人的位置,也就排好了序。当然,年龄一样时需要特殊处理(保证稳定性):通过反向填充目标数组,填充完毕后将对应的数字统计递减,可以确保计数排序的稳定性。

  计数排序的步骤如下:

统计数组A中每个值A[i]出现的次数,存入C[A[i]]
从前向后,使数组C中的每个值等于其与前一项相加,这样数组C[A[i]]就变成了代表数组A中小于等于A[i]的元素个数
反向填充目标数组B:将数组元素A[i]放在数组B的第C[A[i]]个位置(下标为C[A[i]] - 1),每放一个元素就将C[A[i]]递减
  计数排序的实现代码如下:
#include<iostream>
using namespace std;

// 分类 ------------ 内部非比较排序
// 数据结构 --------- 数组
// 最差时间复杂度 ---- O(n + k)
// 最优时间复杂度 ---- O(n + k)
// 平均时间复杂度 ---- O(n + k)
// 所需辅助空间 ------ O(n + k)
// 稳定性 ----------- 稳定


const int k = 100;   // 基数为100,排序[0,99]内的整数
int C[k];            // 计数数组

void CountingSort(int A[], int n)
{
    for (int i = 0; i < k; i++)   // 初始化,将数组C中的元素置0(此步骤可省略,整型数组元素默认值为0)
    {
        C[i] = 0;
    }
    for (int i = 0; i < n; i++)   // 使C[i]保存着等于i的元素个数
    {
        C[A[i]]++;
    }
    for (int i = 1; i < k; i++)   // 使C[i]保存着小于等于i的元素个数,排序后元素i就放在第C[i]个输出位置上
    {
        C[i] = C[i] + C[i - 1];
    }
    int *B = (int *)malloc((n) * sizeof(int));// 分配临时空间,长度为n,用来暂存中间数据
    for (int i = n - 1; i >= 0; i--)    // 从后向前扫描保证计数排序的稳定性(重复元素相对次序不变)
    {
        B[--C[A[i]]] = A[i];      // 把每个元素A[i]放到它在输出数组B中的正确位置上
                                  // 当再遇到重复元素时会被放在当前元素的前一个位置上保证计数排序的稳定性
    }
    for (int i = 0; i < n; i++)   // 把临时空间B中的数据拷贝回A
    {
        A[i] = B[i];
    }
    free(B);    // 释放临时空间 
}

int main()
{
    int A[] = { 15, 22, 19, 46, 27, 73, 1, 19, 8 };  // 针对计数排序设计的输入,每一个元素都在[0,100]上且有重复元素
    int n = sizeof(A) / sizeof(int);
    CountingSort(A, n);
    printf("计数排序结果:");
    for (int i = 0; i < n; i++)
    {
        printf("%d ", A[i]);
    }
    printf("\n");
    return 0;
}
分享到:
评论

相关推荐

    超级经典的计数排序算法,号称效率达到了O(n)

    超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称...

    Java实现计数排序

    Java实现计数排序不是C,Java实现计数排序不是C,Java实现计数排序不是C

    算法-计数排序

    主要是对算法导论中计数排序的实现

    计数排序(代码片段)

    计数排序(代码片段)

    排序算法之计数排序源代码另附博客地址

    排序算法之计数排序,计数排序是一种线性的排序算法,比基于比较的排序算法效率高,但其应用有特定的领域。我给出了两种策略的计数排序算法,欢迎下载~~如程序中有Bug,恳请指正!

    计数排序源代码C++实现

    计数排序 用C++实现 简单易懂 欢迎下载

    计数排序算法实例

    算法导论上计数排序算法的vc.60Test实例

    计数排序的算法实现

    计数排序的代码实现,对应分析在我的博客里找,学习和开发的随便下

    计数排序算法的C语言实现

    以前看过网上的一篇关于一种号称时间复杂度能达到O(n)的不用比较就可以实现排序的算法——计数排序法,这是自己用C写的一个实现,大家可以参考下,欢迎指证。

    C语言版的排序方法---计数排序.docx

    C语言版的排序方法---计数排序.非常有用的代码,可以实际中使用。

    计数排序.py 使用python来实现

    计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数...

    Python3实现计数排序(源代码)

    计数排序是一种适用于非负整数且范围不大的线性时间排序算法。它通过统计每个元素出现的次数,并利用这个信息将元素放到排序后数组的正确位置上。计数排序具有速度快、稳定性好、空间利用率高的优点,但其局限性在于...

    C++实现计数排序(源代码)

    计数排序是一种非比较型整数排序算法,特别适用于一定范围内的非负整数排序。该算法通过统计每个元素出现的次数来确定元素在排序后数组中的位置,从而达到排序的目的。计数排序的时间复杂度为O(n+k),其中n为待排序...

    Java实现计数排序算法(源代码)

    计数排序是一种非比较型整数排序算法,特别适用于一定范围内的非负整数排序。该算法通过统计每个元素出现的次数来确定元素在排序后数组中的位置,从而达到排序的目的。计数排序的时间复杂度为O(n+k),其中n为待排序...

    [Java算法-排序练习]计数排序.java

    该资源提供了在Java中如何实现计数排序的全面指南。文档涵盖了计数排序的基本概念,包括如何对数组进行排序以及如何在Java中实现计数排序。此外,文档还包括一个逐步指南,介绍了如何在Java中实现计数排序,包括详细...

    计数排序代码

    利用python实现计数排序,程序直接可以用

    java实现计数排序算法

    countingSort 方法实现了计数排序算法。首先,我们遍历一遍原数组,找出其中的最大值,以确定计数数组的大小。然后,创建计数数组 count,并将每个元素的出现次数记录在计数数组中。接下来,根据计数数组中的元素...

    python手写计数排序.zip

    计数排序

    计数排序——count_sort

    void count_sort(int A[],int B[],int k) { int *C = (int *)malloc((k+1) * sizeof(int)); int i,j; for(i=0;i;i++)//初始化数组C C[i]=0; for(j=0;j;j++)//计算A中元素的个数 C[A[j]] = C[A[j]]+1;...}

    详解计数排序算法及C语言程序中的实现

    关于计数排序算法 当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。 由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待...

Global site tag (gtag.js) - Google Analytics