计数排序-countingSort

应用场景: 数据重复出现次数大 数据紧凑。

主导思想:

用原数组的最大值为长度申请一个数组初始化为零,遍历原数组,将原数组的每个值当做新数组的下标 里面值++ ;arrNew[arr[i]]++ 。

最后遍历新数组 将新数组的每个非零值 循环变成0,即将 有序的数 导回原数组

代码:

//计数排序  适用于数据比较密集 而且重复率比较大的 数组
void CountingSort(int arr[],int nLen)
{
    //参数检查
    if(arr==NULL || nLen<=0)return ;
    int Max=0;
    //找到原数组 最大 值
    for(int i=0;i<nLen;i++)
    {
        if(arr[i]>Max)
            Max=arr[i];            //记录下最大值
    }
    //申请一个新数组
    int *temp=(int *)malloc(sizeof(int )*(Max+1));
    //新数组赋空
    memset(temp,0, sizeof(int )*(Max+1));
    //给这个数组赋值
    for(int i=0;i< nLen;i++)
    {
        temp[arr[i]]++;
    }
    //定义一个原数组的索引
    int index=0;
    //从这个数组里面拿出来 非零值  给 原来的数组赋值
    for(int i=0;i<=Max;i++)
    {
        while( temp[ i]  )
        {
            arr[index++]=i;
            temp[ i] --;
        }
    }

}

后记:

计数排序的 局限性较大。但其中 用到的 思想可以拿来参考,也是其价值所在。即不去进行 比较,每个值对应数组下标。

时间: 2024-10-04 21:08:59

计数排序-countingSort的相关文章

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

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

计数排序(counting-sort)

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

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

计数排序是需要假设输入数据的排序之一,它假设输入元素是0到k区间内的一个整数,其中k为某个整数.当k=O(n)时,计数排序的时间复杂度为θ(n). 因为不是通过比较来排序,所以它的时间复杂度可以达到θ(nlgn)以下. 计数排序是稳定的排序之一. 代码如下:(仅供参考) //计数排序期望输入数据都是小区间内的整数 void CountingSort(int * const begin, int * const end) { vector<int> temp(10000); //假设输入值小于1

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

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

有Leetcode中一道题,谈桶排序,基数排序和计数排序

几种非比较排序 在LeetCode中有个题目叫Maximum Gap,是求一个非排序的正数数列中按顺序排列后的最大间隔.这个题用桶排序和基数排序都可以实现.下面说一下桶排序.基数排序和计数排序这三种非比较排序. 桶排序 这种排序的主要思想是,把数列分配到多个桶中,然后再在各个桶中使用排序算法进行排序,当然也可以继续使用桶排序. 假设数组的最大值是A,最小值是B,长度是L,则每个桶的大小可以是S=Max(1,(A-B)/(L-1))则可以分为(A-B)/S+1个桶. 对于数列中的数字x,用(x-B

计数排序(counting_sort) 算法分析

线性时间排序的一种(时间复杂度为(n)) 计数排序(Counting sort)是一种稳定的排序算法.计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数.然后根据数组C来将A中的元素排到正确的位置. 计数排序的特征 当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k).计数排序不是比较排序,排序的速度快于任何比较排序算法. 由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序

[一周一算法]算法导论学习之计数排序

计数排序是一种线性时间的排序,同时也是一种非比较排序 代码如下: 1 void CountingSort(int *data, int k, int num) // A ~ data[], B ~ aimArray[], C ~ tempArray[] 2 { 3 int *aimArray = new int[num]; 4 int *tempArray = new int[k + 1]; 5 for (int i = 0; i <= k; i++) 6 tempArray[i] = 0; 7

[经典算法]计数排序

概述: 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出.它的优势在于在对一定范围内的集合排序时,它的复杂度为Ο(n+k)(其中k是元素的范围),快于任何比较排序算法. 计数排序本质上是通过计算无序集合中元素出现的次数来决定集合应该如何排序的. 例如一个数组{1, 4, 1, 2, 7, 5, 2},进行计数排序过程 1.使用Count数组记录元素次数 Index: 0 1 2 3 4 5 6 7 8 9 Count: 0 2 2 0 1 1 0

算法-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