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

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

posted @ 2014-04-27 22:09  AndyZeng  阅读(610)  评论(0编辑  收藏  举报