插入排序之希尔排序

 1.  定义:把记录按下标的一定增量分组,对于每组使用直接插入排序算法的排序;随着增量的逐渐减少,每组包含的关键字越来越少,当增量减至1时,整个文件被分为一组,算法便终止。

  2.  原理:

            (1)计算步长:步长=数组长度/2;

(2)根据步长分组,每组内部实行直接插入排序;

(3)重复执行(1)、(2)步骤,直到步长为1,算法变成快速排序。

3.  排序图表表示:

 

4. 复杂度:

空间复杂度O(1)

时间复杂度O(n^1.3)~O(n^2)

5.  总结:

(1)希尔排序时插入排序算法的一种更高效的改进;

(2)希尔排序是一种不稳定的算法;

(3)希尔排序实质上是一种分组插入方法.

6.  C#代码实现:

 class Program
    {
        static void Main(string[] args)
        {
            // 待排序数组
            int[] sortArray = { 2, 8, 3, 5, 7, 1, 4, 6, 9 };
            Stopwatch sw = new Stopwatch();
            // 开始计时
            sw.Start();
            // 希尔排序算法
            ShellSrot(sortArray);
            // 计时结束
            sw.Stop();
            Console.WriteLine("希尔排序方法耗时(毫秒)=" + sw.ElapsedMilliseconds);
        }
        /// <summary>
        /// 希尔排序
        /// </summary>
        /// <param name="sortArray">待排序数组</param>
        private static void ShellSrot(int[] sortArray)
        {
            // 首次步长d
            int d = sortArray.Length / 2;
            while (d > 0)
            {
                // 按组循环排序
                for (int i = 0; i < d; i++)
                {
                    // 每组内部使用直接插入算法
                    for (int j = i + d; j < sortArray.Length; j += d)
                    {
                        int temp = sortArray[j];
                        int k;
                        //  每组中元素相互比较,大的后移
                        for (k = j - d; k >= i && sortArray[k] > temp; k = k - d)
                        {
                            sortArray[k + d] = sortArray[k];
                        }
                        //  插入小值
                        sortArray[k + d] = temp;

                        //for (k = j - d; k >= i; k = k - d)
                        //{
                        //    if (sortArray[k] > sortArray[k + d])
                        //    {
                        //        int t = sortArray[k + d];
                        //        sortArray[k + d] = sortArray[k];
                        //        sortArray[k] = t;
                        //    }
                        //}
                    }
                }
                d = d / 2;
                // 打印输出
                ShowSortResult(sortArray);
            }
        }
        /// <summary>
        /// 排序结果展示
        /// </summary>
        /// <param name="bubbleArray">排序数组</param>
        private static void ShowSortResult(int[] sortArray)
        {
            for (int k = 0; k < sortArray.Length; k++)
            {
                Console.Write(sortArray[k] + "  ");
            }
            Console.WriteLine();
        }
    }

7.  运行结果:

posted @ 2020-04-07 22:21  南溪风  阅读(145)  评论(0)    收藏  举报