`
北极的。鱼
  • 浏览: 160829 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】计数排序

 
阅读更多

转自: http://blog.csdn.net/pi9nc/article/details/12220851

 

1)算法简介

    计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。

 

2)算法描述和分析

        算法的步骤如下:

         1、找出待排序的数组中最大和最小的元素

         2、统计数组中每个值为i的元素出现的次数,存入数组C的第i项

         3、对所有的计数累加(从C中第一个元素开始,每一项和前一项相加,其实就是根据个数转换为地址)

         4、反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

 

        当输入的元素是n 个0到k之间的整数时,它的运行时间是 O(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。

        由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。例如:计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名。但是,计数排序可以用在基数排序中的算法来排序数据范围很大的数组。

 

3)算法图解

        我们使用计数排序对一个乱序的整数数组进行排序。

        首先创建一个临时数组(长度为输入数据的最大间隔),对于每一个输入数组的整数k,我们在临时数组的第k位置"1"。如下图



         上图中,第一行表示输入数据,第二行表示创建的临时数据,临时数组的下标代表输入数据的某一个值,临时数组的值表示输入数据中某一个值的数量。

         如果输入数据中有重复的数值,那么我们增加临时数组相应的值(比如上图中5有3个,所以小标为5的数组的值是3)。在“初始化”临时数组以后,我们就得到了一个排序好的输入数据。


 

        我们顺序遍历这个数组,将下标解释成数据, 将该位置的值表示该数据的重复数量,记得得到一个排序好的数组。

4)算法代码

#include <stdlib.h>  
#include <string.h>  
#include <stdio.h>  
/************************************************************** 
 功能:计数排序。 
 参数: data : 要排序的数组 
        length :数组元素的个数 
        maxValue   :数组中元素数组最大值 +1 (这个需要+1,因为数组索引从0开始) 
 返回值: 成功0;失败-1.        
 *************************************************************/  
int ctsort(int *data, int length, int maxValue)  
{  
    int * counts = NULL,/*计数数组*/  
        * temp = NULL;/*保存排序后的数组*/  
    int i = 0;  
    /*申请数组空间*/  
    if ((counts = (int *) malloc( maxValue * sizeof(int))) == NULL)  
        return -1;  
    if ((temp = (int *) malloc( length * sizeof(int))) == NULL)  
        return -1;  
    /*初始化计数数组*/  
    for (i = 0; i < maxValue; i ++)  
        counts[i] = 0;  
    /*数组中出现的元素,及出现次数记录*/  
    for(i = 0; i < length; i++)  
        counts[data[i]] += 1;  
    /*调整元素计数中,加上前一个数,其实就是将之前存放的个数转换为地址 */ 
    for (i = 1; i < maxValue; i++)  
        counts[i] += counts[i - 1]; 
    /*使用计数数组中的记录数值,来进行排序,排序后保存的temp*/  
    for (i = length -1; i >= 0; i --){  
        temp[counts[data[i]] - 1] = data[i]; /*从最后一个元素开始找其应该存放的位置*/
        printf("temp[%d]:%d\n",counts[data[i]] - 1,temp[counts[data[i]] - 1]); //查看一下temp数组
        counts[data[i]] -= 1;  
    }  
 
    memcpy(data,temp,length * sizeof(int));  
    free(counts);  
    free(temp);  
    return 0;  
}  
int main()  
{  
    int a[8] = {2,0,2,1,4,6,7,4};  
    int max = a[0],  
        i = 0;  
    /*获得数组中中的数值*/  
    for ( i = 1; i < 8; i++){  
        if (a[i] > max)  
            max = a[i];  
    }  
    ctsort(a,8,max+1);//因为数组索引从0开始,所以要加1  
    for (i = 0;i < 8;i ++)  
        printf("%d\n",a[i]);  
} 

 

 

  • 大小: 39.2 KB
  • 大小: 35.1 KB
分享到:
评论

相关推荐

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

    计数排序是一种非基于比较的排序算法,它的主要思想是通过统计待排序数组中每个元素出现的次数,然后根据这些计数来确定每个元素在排序结果中的位置。这种算法特别适用于整数排序,且在数据范围不大的情况下,效率极...

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

    ### C++实现计数排序(源代码) #### 实现原理 计数排序是一种非比较型整数排序算法,其核心思想在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序算法,计数排序要求输入的...

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

    ### Java实现计数排序算法详解 #### 一、概述 计数排序是一种高效的非比较型整数排序算法,尤其适用于已知数据范围内非负整数的排序任务。它通过统计数组中每个数值出现的频率来确定各个数值在排序后数组中的确切...

    计数排序法(输入数据可以是负数和小数).zip

    计数排序法是一种非基于比较的排序算法,它的工作原理是通过确定每个元素在排序结果中出现的次数来实现排序。原始的计数排序法通常适用于整数排序,因为其核心思想是为每个可能的输入值创建一个计数器,然后遍历输入...

    算法-理论基础- 排序- 计数排序(包含源程序).rar

    计数排序是一种非基于比较的排序算法,它适用于待排序的元素是整数的情况。这种排序方法的思想是通过计算每个元素在输出数组中应该出现的次数来确定它们的位置,从而达到排序的目的。以下是对计数排序算法的详细介绍...

    秩和检验:基于python实现,使用计数排序、快速排序算法

    本篇将重点介绍如何利用Python编程语言,结合计数排序和快速排序算法来实现秩和检验。 首先,我们来看计数排序(Counting Sort)。这是一种非基于比较的排序算法,适用于待排序的数据范围相对较小且已知的情况下。...

    JS实现的计数排序与基数排序算法示例

    计数排序与基数排序是两种非比较型排序算法。计数排序适用于一定范围内的整数排序,在特定条件下,它比基于比较的排序算法如快速排序、归并排序等拥有更好的时间复杂度。基数排序则是一种借助“基数”概念来按位数...

    单词计数和排序程序

    ### 单词计数与排序程序分析 #### 一、程序概述 本程序的主要功能是对一组字符进行统计,找出其中出现次数最多的字母及其出现次数,并按照出现次数进行降序排列。程序采用Java语言编写,利用了`HashMap`来存储每个...

    js 计数排序的实现示例(升级版)

    计数排序是一种非基于比较的排序算法,它适用于待排序数据是整数且范围不大的情况。这种排序方法的基本思想是统计每个数在输入数组中出现的次数,然后根据这些计数来确定每个数在输出数组中的位置。在这个升级版的...

    C++写基数排序算法

    在C++中实现基数排序,主要涉及到数组、计数排序以及位操作等技术。以下是关于基数排序及其C++实现的详细解释: 一、基数排序概述 基数排序基于数字的位值进行排序,它首先根据最低有效位(个位)进行排序,然后是...

    线性时间排序算法

    2. **稳定性要求**:由于基数排序是通过多次计数排序来完成的,因此计数排序必须是稳定的,这样才能保证整个排序过程也是稳定的。 3. **时间复杂度**:如果计数排序的时间复杂度为O(d(n + k)),其中d是最大的位数,n...

    各种排序算法 C++实现

    本资源提供了C++语言实现的多种排序算法,包括计数排序、基排序、快速排序、归并排序和堆排序。这些算法各有特点,适用场景不同,对于理解和掌握数据处理有极大帮助。 首先,我们来看计数排序。这是一种非基于比较...

    基数排序代码.docx

    为了简化,我们假设所有整数都是非负整数,并且使用计数排序(Counting Sort)作为子过程来对每一位进行排序。 python def counting_sort(arr, exp): """ 计数排序,用于基数排序的子过程 :param arr: 待排序...

    各种常用排序算法的C语言实现

    计数排序适用于非负整数排序,统计每个数字出现的次数,然后根据这些统计结果确定每个元素的位置。C语言实现时,需要额外创建一个计数数组。计数排序的时间复杂度为O(n + k),其中k为整数范围。 9. 桶排序(Bucket ...

    最快的排序算法 计算机最快的算法-史上14个最快速算法:孩子的计算能力爆表!大脑堪比计算机!...,排序算法数据结构

    计数排序算法是一种高效的排序算法,它的工作原理是通过将数组中的每个元素转换成一个计数,然后将计数排序,以达到排序的目的。计数排序算法的时间复杂度为O(n+k),因此它适合大规模的数据排序。 11.Timsort排序...

    12种排序算法详解(寒小阳博客转出PDF版)

    10. 计数排序(Counting Sort):是一种非比较型的排序算法,适用于一定范围内的整数排序。 11. 基数排序(Radix Sort):按照低位先排序,然后收集;再按照高位排序,然后再收集;以此类推,直到最高位。 这12种...

    排序算法集锦

    内排序又可以根据不同的策略分为五类:插入排序、选择排序、交换排序、归并排序、分配排序和计数排序。 插入排序算法包括直接插入排序、折半插入排序和希尔排序。直接插入排序的步骤是将无序序列中的数据逐个插入到...

    C语言实现十大排序算法.rar

    8. 计数排序(Counting Sort):计数排序是一种非基于比较的排序算法,适用于待排序的元素范围较小的情况。通过统计每个元素出现的次数,确定其在排序结果中的位置。C语言实现计数排序需要额外的计数数组。 9. 桶...

    java程序员必知的8大排序[转]

    计数排序不是基于比较的排序算法,适用于非负整数排序。通过统计每个元素出现的次数,然后按照元素值依次输出即可得到排序结果。由于它不依赖比较,因此效率很高,但对内存消耗较大。 8. 基数排序(Radix Sort) ...

Global site tag (gtag.js) - Google Analytics