C#算法设计排序篇之08-计数排序(附带动画演示程序)

计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的时间复杂度为线性的O(n+k)(其中k是整数的范围,即max – min + 1),快于任何比较排序算法,这是一种典型的空间换时间的算法。

C#算法设计排序篇之08-计数排序(附带动画演示程序)

C#算法设计概述

计数排序Counting Sort

计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的时间复杂度为线性的O(n+k)(其中k是整数的范围,即max – min + 1),快于任何比较排序算法,这是一种典型的空间换时间的算法。

示例

public class Program {

    public static void Main(string[] args) {
        int[] array = { 43, 69, 11, 72, 28, 21, 56, 80, 48, 94, 32, 8 };

        CountingSort(array);
        ShowSord(array);

        Console.ReadKey();
    }

    private static void ShowSord(int[] array) {
        foreach (var num in array) {
            Console.Write($"{num} ");
        }
        Console.WriteLine();
    }

    public static void CountingSort(int[] array) {
        if (array.Length == 0) return;
        int min = array[0];
        int max = min;
        foreach (int number in array) {
            if (number > max) {
                max = number;
            }
            else if (number < min) {
                min = number;
            }
        }
        int[] counting = new int[max - min + 1];
        for (int i = 0; i < array.Length; i++) {
            counting[array[i] - min] += 1;
        }
        int index = -1;
        for (int i = 0; i < counting.Length; i++) {
            for (int j = 0; j < counting[i]; j++) {
                index++;
                array[index] = i + min;
            }
        }
    }

}

以上是计数排序算法的一种实现,以下是这个案例的输出结果:

8 11 21 28 32 43 48 56 69 72 80 94

分析

计数排序算法的时间复杂度为: O(n+k) ,即其时间复杂度是线性的。

AlgorithmMan

C#算法设计排序篇之08-计数排序(附带动画演示程序)

AlgorithmMan by Iori,AlgorithmMan是使用C#开发的一套用于算法演示的工具。

GitHub下载地址:https://github.com/byteflying/AlgorithmManRelease

本文由 .Net中文网 原创发布,欢迎大家踊跃转载。

转载请注明本文地址:https://www.byteflying.com/archives/689

发表评论

登录后才能评论