counting sort

转载 2013年12月05日 11:25:39

转自算法导论第二版8.2节


计数排序不是比较排序。计数排序是用了输入元素的实际值来确定它们在数组中的位置。

计数排序假设n个输入数据中的每一个都是介于0到k之间的整数,此外k为某个整数。当k=O(n)时,计数排序的运算时间为Θ(n)。

注意这个算法的前提是每个数据都是0<= xi <= k <= n的整数。

计数排序的基本思想就是对每个输入元素x,确定出小于x的元素个数。有了这个信息,就可以把x直接放到他在最终输出数组中的位置。

在计数排序算法的代码中,我们假定输入时个数组A[1...n],length[A] = n。另外还需要两个数组:存放排序结果的B[1...n],以及提供临时存储区的C[0...k]。

计数排序的时间代价是Θ(n+k)。在实践中,当k=O(n)时,我们常常采用计数排序,这样其运行时间为Θ(n)。

计数排序的一个重要性质就是它是稳定的:具有相同值的元素在输入数组中的相对次序与他们在输入数组中的次序相同。亦即,两个相同数之间的顺序是这样来规定的,即在输入数组中先出现的,在输出数组中也位于前面。


伪代码

COUNTING-SORT(A, B, k)

    for i <- 0 to k

        do C[i] <- 0

    for j <- 1 to length[A]

        do C[A[j]] <- C[A[j]] +1

    for i <- 1 to k

        do C[i] <- C[i] + C[i-1]

    for j <- length[A] downto 1

        do B[C[A[j]]] <- A[j]

             C[A[j]] <- C[A[j]] -1


#include <stdio.h>

void countingsort(int a[], int b[], int len, int k)
{
    int i;
	int c[k+1];

    for (i = 0; i <= k; i++) {
		c[i] = 0;
	}

    for (i = 1; i <= len; i++ ) {
		c[a[i]]++;
	}

    for (i = 1; i <= k; i++) {
		c[i] += c[i-1];
	}

    for (i = len; i>= 1; i--) {
		b[c[a[i]]] = a[i];
        c[a[i]]--;
	}
}

int main(void)
{
    int i;
    int A[] = {
		0, 2, 5, 3, 0, 2, 3, 0, 3
	};
    int B[9];

    countingsort(A, B, 8, 5);

    for (i = 1; i < 9; i++) {
		printf("%d ", B[i]);
	}

	return 0;
}



相关文章推荐

In-place Counting Sort

计数排序用于一定范围内的整数,并且这些整数的值比较小。该算法通过统计每个整数在序列中出现的次数来实现排序。由于它不是通过比较实现排序的,所以nlgn并不是复杂度的下限。当然,计数排序经常作为基数排序的...

排序算法总结之计数排序 Counting Sort

算法原理: 排序算法根据排序的原理可以分为两类:基于比较的和非比较的。常见的基于比较的排序算法有快速排序,堆排序,归并排序等,基于比较的排序算法平均情况最好是O(nlogn)。基于非比较的排序算法有三...

第八章线形时间排序之“计数法排序COUNTING-SORT”

这个方法很牛逼,这个排序方法不再像前面那些排序方法一样根据比较来进行。 时间复杂度为O(k+n+k+n+n)=O(n),当k=O(n)时,可以保证时间复杂度为O(n),就可以用计数法来进行排序了。 ...

Counting Sort 计数排序算法在学生管理系统排序的应用例子

这个算法主要用在关键数字(key number)小的时候,按照关键数字排序的效率是非常高的。 比如我们有6个教室的学生需要按教室号排序,如下是学生的信息数据结构: 需要的空间就是关键数字的最大值的空...

计数排序 (Counting Sort)

原文:wiki : http://en.wikipedia.org/wiki/Counting_sort http://zh.wikipedia.org/wiki/%E8%AE%A1%E6%95%B0...

Foundation: Distribution Counting Sort

+...

计数排序Counting sort

计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排...

算法导论 第八章计数排序(counting sort)

#include #include #include using namespace std; //待排数据在[0,k]范围内,也可以改变上下界,不过要注意一定让 //这个范围的大小大...

线性时间排序 计数排序(Counting Sort)

基本思想: 我们已经学习过其他的排序算法,插入排序,归并排序,快速排序,随机快速排序,堆排序等等。但是这些算法最快的也要O(nlgn)。如何做到线性时间的排序呢?我们常说,空间和时间代价可以转换。我...

introduction to algorithms sorting lesson_6 Counting sort (计数排序)

计数排序 可在
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)