CountingSort(计数排序)原理及C++代码实现

计数排序是需要假设输入数据的排序之一,它假设输入元素是0到k区间内的一个整数,其中k为某个整数。当k=O(n)时,计数排序的时间复杂度为θ(n)。

因为不是通过比较来排序,所以它的时间复杂度可以达到θ(nlgn)以下。

计数排序是稳定的排序之一。

代码如下:(仅供参考)

//计数排序期望输入数据都是小区间内的整数
void CountingSort(int * const begin, int * const end) {
    vector<int> temp(10000); //假设输入值小于10000
    vector<int> out(end - begin);

    for (int i = 0; i < end - begin; ++i)
        ++temp[*(begin + i)];
    for (int i = 1; i < 10000; ++i)
        temp[i] += temp[i-1];
    for (int i = end - begin - 1; i >= 0; --i) {
        out[temp[*(begin + i)] - 1] = *(begin + i);
        --temp[*(begin + i)];
    }
    for (int i = 0; i < end - begin; ++i)
        *(begin + i) = out[i];
}

原文地址:https://www.cnblogs.com/yxsrt/p/12193682.html

时间: 2024-11-19 14:45:15

CountingSort(计数排序)原理及C++代码实现的相关文章

计数排序的理解和代码实现

由决策树模型可知,比较排序最坏情况的下届要比较nlgn次,不是线性排序的.所以,在算法导论中提出了几种线性排序,其中计数排序就是一种.下面总结一下计数排序的原理: 假设n个输入元素中的每一个元素都是在[0,..,k]内的整数.设输入数组为A[n]:输出数组为B[n]:临时存储数组为C[k].算法如下: 1.把C[k]中的元素全部置0. 2.统计A中含有元素i的个数(i={0,...,k-1}),并存储在C[i]中. 3.统计A中小于等于i的元素的个数(i={0,...,k-1}),并存储在C[i

计数排序(counting-sort)

计数排序是一种稳定的排序算法,它不是比较排序.计数排序是有条件限制的:排序的数必须是n个0到k的数,所以计数排序不适合给字母排序.计数排序时间复杂度:O(n+k),空间复杂度:O(k),当k=n时,时间复杂度可以达到O(n). 计数排序思想:给定一个符合规定的无序数组,先求出这个数组中最大的数,然后开辟一个辅助数组,将无序数组中的数对应到辅助数组中,并计算出每个数出现的次数.再继续从辅助数组中得出到了每个位置,需要排序的数组中的数出现了几次,然后对应的将无序的数组赋值给另一个数组. 排序过程:

算法-java代码实现计数排序

计数排序 第10节 计数排序练习题 对于一个int数组,请编写一个计数排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public class CountingSort { 4 public int[] countingSort(int[] A, int n) { 5 countingSo

计数排序-countingSort

应用场景: 数据重复出现次数大 数据紧凑. 主导思想: 用原数组的最大值为长度申请一个数组初始化为零,遍历原数组,将原数组的每个值当做新数组的下标 里面值++ ;arrNew[arr[i]]++ . 最后遍历新数组 将新数组的每个非零值 循环变成0,即将 有序的数 导回原数组 代码: //计数排序 适用于数据比较密集 而且重复率比较大的 数组 void CountingSort(int arr[],int nLen) { //参数检查 if(arr==NULL || nLen<=0)return

计数排序(counting-sort)&mdash;&mdash;算法导论(9)

1. 比较排序算法的下界 (1) 比较排序     到目前为止,我们已经介绍了几种能在O(nlgn)时间内排序n个数的算法:归并排序和堆排序达到了最坏情况下的上界:快速排序在平均情况下达到该上界.     如果仔细观察,我们会发现:在排序的最终结果中,各元素之间的次序依赖于它们之间的比较.我们把这类排序算法统称为比较排序.到目前为止我们介绍的排序算法都是比较排序.下面我们来论证一个事实:任何比较排序算法在最坏情况下都要经过Ω(n lgn)次比较. (2) 决策树模型     在证明之前,我们先介

计数排序【代码】

任何比较排序(归并排序,插入排序等等)的时间复杂度在最坏的情况下都需要做Ω(n * lgn)次比较,而这里的的计数排序由于它不是基于比较排序的思路,所以它的复杂度不收这个限制,它的时间复杂度为Θ(n),为线性时间.同时,计数排序一个重要的性质就是它是稳定的,也就是说,对于两个相同的数来说,在输入数组中先出现的,在输出数组中也位于前面. 详细知识参考<算法导论>P109 ----------------------------------------------------------代码如下-

计数排序Java代码实现

结论:由于计数排序不是基于比较的排序,所以时间复杂度可以突破O(nlgn);计数排序时间复杂度为O(n),额外空间复杂度为O(n); Java实现代码如下: 1 package com.cmbc.test1; 2 3 public class CountSorting { 4 5 public static void countSort(int[] arr){ 6 if(arr==null||arr.length<2){ 7 return; 8 } 9 int max = Integer.MIN

动画展现十大经典排序算法(附代码)

0.算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序. 0.2 算法复杂度 0.3 相关概念 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面. 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面.

基数排序与桶排序,计数排序【详解】

桶排序简单入门篇^-^ 在我们生活的这个世界中到处都是被排序过的东东.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东东都需要排序,可以说排序是无处不在.现在我们举个具体的例子来介绍一下排序算法. 首先出场的是我们的主人公小哼,上面这个可爱的娃就是啦.期末考试完了老师要将同学们的分数按照从高到低排序.小哼的班上只有5个同学,这5个同学分别考了5分.3分.5分.2分和8分,哎,考得真是惨不忍睹(满分是10分).接下来将分