`
sunwinner
  • 浏览: 198021 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

计数排序(Counting Sort)

 
阅读更多

 

计数排序假设n个输入元素中的每一个都是介于0-k的整数,此处k为某个整数。计数排序顾名思义离不开计数,我们要计的是输入元素中相同元素出现的次数。对每一个输入元素x,确定小于x的元素的个数,那样排序之后,x在最终输出数组中的位置就可以确定了。例如:如果有17个元素小于x,则x就位于第18个输出的位置上。当然有几个元素相同时,这个方法就略微改进一下,因为不能将它们放在同一个位置上。

假定输入数组为A[1..n],他们的值均位于0~k之间,输出排序之后的数组为B[1..n],以及临时存储数组C[0..k]。计数排序的伪代码如下:

memset(C,sizeof(C),0);       //C数组置零  
for i=1 to n do  
    C[A[i]]++;               //统计输入数组中相同元素的个数  
for i=2 to k do  
    C[i] = C[i]+C[i-1];       //C[i]表示输入数组中小于或者等于i的元素个数  
for i=n downto 1 do  
    B[C[A[i]]] = A[i];       //把每一个A[i]放到输出数组中相应位置上  
    C[A[i]]--;             //如果有几个相同元素时,当然不能放在同一个位置了。

 

计数排序特点:

1.  提前必须是已知待排序的关键字为整型且范围已知。

2.  时间复杂度为O(n+k),不是基于比较的排序算法,因此效率非常之高。

3.  稳定性好,这个是计数排序非常重要的特性,可以用在后面介绍的基数排序中。

4.  但需要一些辅助数组,如C[0..k],因此待排序的关键字范围0~k不宜过大。而B[1..n]用来存放排序结果,我们可以对上述算法进行改进,使排序在原地进行。改进之后如下:

memset(C,sizeof(C),0);       //C数组置零  
for i=1 to n do  
        C[A[i]]++;               //统计输入数组中相同元素的个数  
idx = 0;  
for i=0 to k do               
        while(C[i]>0) do         //C[i]中保存的是值为i元素的个数  
            A[idx++] = i;        //因此很容易找到i在A中适合的位置  
            C[i]--;   

 

最终实现的C代码如下:

int countingSort(int *ar, int n, int k) {
    int i, idx = 0;
    int *B = calloc(k, sizeof(int));

    for (i = 0; i < n; i++) {
        B[ar[i]]++;
    }

    for (i = 0; i < k; i++) {
        while (B[i]-- > 0) {
            ar[idx++] = i;
        }
    }
    free(B);
}

end.

分享到:
评论
1 楼 ender35 2013-08-14  
第二种实现仅能用于数组排序

相关推荐

    经典算法的C#源码实现

    经典的排序算法C#源码,包括: 经典排序算法 - 快速排序Quick sort 经典排序算法 - 桶排序Bucket sort 经典排序算法 - 插入排序Insertion sort 经典排序算法 - 基数排序...经典排序算法 - 计数排序Counting sort

    计数排序JAVA实现counting sort algorithm

    伪代码和算法介绍在此:http://www.algorithmist.com/index.php/Counting_sort,本程序是 根据这个伪代码编写的源代码

    AlgorithmMan by Iori(Counting Sort)

    CountingSort为AlgorithmMan中的计数排序演示工具(这是可执行文件;需要.net 4.0支持;非源代码)。 原文:C#算法设计排序篇之08-计数排序(附带动画演示程序) 链接:...

    CountingSort:计数排序算法的实现

    计数排序 麻省理工学院“算法导论”课程中介绍的计数排序算法的实现。 例子 var countingSort = require ( './countingSort.js' ) ; // Construct input [0, 5], therefore an array of size 6 is needed // for ...

    java实现计数排序算法

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

    JavaScript计数排序算法1

    JavaScript计数排序算法计数排序算法计数排序(Counting sort)是一种稳定的线性时间排序算法。计数排序使用一个额外的数组,数组的下标对应待排序

    counting-sort-parallel-openmp:与openmp api并行化的计数排序算法

    计数排序并行openmp Esterepositórioabriga实施工具会按顺序对序数进行排序。 Esses algoritmos foram desenvolvidos no Programme da Disciplina deProgramaçãoParalela e Multicore do curso deCiê...

    python 实现 排序 课程设计 代码

    计数排序(Counting Sort) 循环排序(Cycle Sort) 双重排序(Double Sort) 荷兰国旗排序(Dutch National Flag Sort) 交换排序(Exchange Sort) 外部排序(External Sort) 侏儒排序(Gnome Sort) 堆排序...

    leetcode和oj-acm:leetcode题解记录;算法相关,somesolutionsforACM/ICPConlinejudge

    leetcode 和 ...计数排序 counting sort 基数排序 radix sort 桶排序bucket sort 堆排序 heap_sort 二分查找 69 744 540 278 852[Easy] 贪心法 455 [Medium]435 [Medium]452 [Medium]406 121 122 605

    Javascript排序算法之计数排序的实例

    计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组Count_arr,其中第i个元素是待排序数组Arr中值等于i的元素的个数。然后根据数组Count_arr来将Arr中的元素排到正确的位置。分为四个步骤:1...

    leetcode叫数-Algorithm:从LeetCode学习算法和解决算法问题

    CountingSort,不难理解,但是容易忘,需要多看看,最后排序的时候从后往前排是为了保证算法稳定 桶排序,把数组按大小分成 n 个桶,桶内用快速排序.要求: a. 要排序的数据需要很容易就能划分成 m 个桶,桶与桶之间...

    常用算法(python)

    计数排序(Counting Sort) 基数排序(Radix Sort) 桶排序(Bucket Sort) 深度优先搜索(Depth-First Search, DFS) 广度优先搜索(Breadth-First Search, BFS) 二分查找(Binary Search) 线性查找(Linear ...

    python算法学习之计数排序实例

    def _counting_sort(A, B, k): “””计数排序,伪码如下: COUNTING-SORT(A, B, k) 1 for i ← 0 to k // 初始化存储区的值 2 do C[i] ← 0 3 for j ← 1 to length[A] // 为各值计数 4 do C[A[j]] ← C...

    countingSort:计数排序是一种基于特定范围内的键的排序技术。 它通过计算具有不同键值(有点像哈希)的对象数来工作

    计数排序计数排序是一种基于特定范围内的键的排序技术。 它通过计算具有不同键值的对象数量来工作(类似于哈希)。

    java十大排序算法实现

    java十大排序算法实现 1. 冒泡排序(Bubble Sort) 2. 选择排序(Selection Sort) ...7. 计数排序(Counting Sort) 8. 桶排序(Bucket Sort) 9. 基数排序(Radix Sort) 10. 希尔排序(Shell Sort)

    Python 实现十大经典排序算法-LeetCode案例版

    数据结构与算法-Python语言案例实现十大经典排序算法一、 ... 计数排序(Counting Sort)9. 桶排序(Bucket Sort)10. 基数排序(Radix Sort)三、算法总结 十大经典排序算法 一、 引言 授人以鱼不如授人以渔~ 实践是检

    php计数排序算法的实现代码(附四个实例代码)

    计数排序(Counting sort)是一种根据小整数键对一组对象排序的算法;也就是说,它是一个整数排序算法。它通过计算具有不同键值的对象的数量,并对这些数量使用算术来确定输出序列中每个键值的位置

    几种常见排序算法实现

    1. 8 Radix sort(基数排序):从最低位开始,每位采用稳定的排序算法(如计数排序)。 1.9 Bucket sort:当输入数据比较均匀时采用。 先将数据区间分为n个桶,把数据分放到对应的桶中;对桶内的数据采用插入排序;...

    leetcode中文版-ts-datastructures-algorithms:和我一起学算法吧!

    leetcode中文版 ...计数排序(Counting Sort) 桶排序(Bucket Sort) 基数排序(Radix Sort) 排序算法的稳定性 5. 查找算法 线性查找(Order Search) 插值查找(Interpolation search) 二分查找(Binar

    leetcode切割分组-java_algorithm:排序算法演示

    leetcode切割分组 java_algorithm this is a sorting algorithm demo. created by InterlliJ. that is the java main program. ! com.sample.sort包下 平均时间复杂度 ...CountingSort | 计数排序 | 用一个计算器

Global site tag (gtag.js) - Google Analytics