计数排序(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
欢迎任何形式的转载,但请务必注明出处。