• 非基于比较的排序算法之一:计数排序


    计数排序(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

  • 相关阅读:
    [转]iOS框架和服务
    [Tips]统计Xcode代码行数
    [转]10个迷惑新手的Cocoa,Objective-c开发难点和问题
    关于 MRC 开发中的一些细节
    关于HTTP状态码的说明
    关于 MRC下自动释放池 的嵌套使用的几个问题
    C语言综合运用-------------编写 < 通讯录 >
    FFT与游戏开发(二)
    FFT与游戏开发(一)
    FFT开坑
  • 原文地址:https://www.cnblogs.com/andyzeng/p/3695306.html
Copyright © 2020-2023  润新知