zoukankan      html  css  js  c++  java
  • 非基于比较的排序算法之一:计数排序

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

    限制:所有值得取值范围不能太大,并且需要知道确切的取值范围。本算法需要的辅助空间要求较高。

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

    现在给出C#实现的计数排序(counting sort)

    public void Sort(int[] array, int startIndex, int endIndex, int minValue, int maxValue)
            {
                int[] countingArray = new int[maxValue - minValue + 1];
                for (int i = startIndex; i <= endIndex; i++)
                {
                    countingArray[array[i] - minValue]++;
                }
    
                for (int i = 1; i < countingArray.Length; i++)
                {
                    countingArray[i] = countingArray[i] + countingArray[i - 1];
                }
                //取结果放于新数组sortedArray
                int[] sortedArray = new int[endIndex - startIndex + 1];
                for (int i = endIndex; i >= startIndex; i--)
                {
                    //从后到前扫描原始array数组才能保证排序的稳定性
                    //设array[i]=a,则设countingArray[a-minValue]=aIndex,aIndex表示在排序好的数组中a是第aIndex个,在数组中的下标应为aIndex-1
                    //将a放到sortedArray[aIndex-1].countingArray[a]数值减一表示等于a的其它数值的位置向前步进1个位置。
                    sortedArray[(countingArray[array[i] - minValue]--) - 1] = array[i];
                }
                for (int i = 0; i < sortedArray.Length; i++)
                {
                    array[i + startIndex] = sortedArray[i];
                }
            }

    作者:Andy Zeng

    欢迎任何形式的转载,但请务必注明出处。

    http://www.cnblogs.com/andyzeng/p/3695306.html

  • 相关阅读:
    JAVA基础:JAVA代码编写的30条建议
    Oracle学习之三 程序控制结构
    ExtJs 常用代码片段(7.30更新)
    ExtJs4 之数据模型
    .NET 大杂烩
    .NET 导出Excel
    Javascript实现IE直接打印
    C# Timer用法及实例
    AjaxPro实现无刷新多级联动实例
    VB6.0输入文本写进UTF8格式的文本文件
  • 原文地址:https://www.cnblogs.com/andyzeng/p/3695306.html
Copyright © 2011-2022 走看看