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

希尔排序是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法把数组按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个数组恰被分成一组,算法终止。

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

C#算法设计概述

希尔排序Shells Sort)

希尔排序是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法把数组按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个数组恰被分成一组,算法终止。

示例

public class Program {

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

        for (int i = 0; i < gaps.Length; i++) {
            ShellsSort(array, gaps[i]);
        }
        ShowSord(array);

        Console.ReadKey();
    }

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

    public static void ShellsSort(int[] array, int gap) {
        int length = array.Length;
        for (int i = 0; i < gap; i++) {
            for (int j = i + gap; j < length; j += gap) {
                if (j < length) {
                    if (array[j] < array[j - gap]) {
                        int sentinel = array[j];
                        int k = 0;
                        for (k = j - gap; k >= i && sentinel < array[k]; k -= gap) {
                            array[k + gap] = array[k];
                        }
                        array[k + gap] = sentinel;
                    }
                }
            }
        }
    }

}

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

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

分析

在最坏的情况下时间复杂度为: O(n^{2})
最好的情况下时间复杂度为: O(n)
平均情况下时间复杂度为: O(n^{1.3})

希尔排序中增量序列的选择对算法的效率有重大的影响,其平均情况下时间复杂度的证明为世界性数学难度,目前根据经验发现的最好的增量序列在平均情况下的时间复杂度为: O(n^{1.3})

AlgorithmMan

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

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

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

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

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

发表评论

登录后才能评论