排序算法-希尔排序

部分内容转自-http://blog.csdn.net/morewindows/article/details/6668714

希尔(Shell)排序又称为缩小增量排序,它是一种插入排序。它是直接插入排序算法的一种威力加强版

该方法因DL.Shell于1959年提出而得名。

希尔排序的基本思想是:

把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。
随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。

 

以n=10的一个数组49, 38, 65, 97, 26, 13, 27, 49, 55, 4为例

第一次 gap = 10 / 2 = 5

49   38   65   97   26   13   27   49   55   4

1A                                        1B

        2A                                         2B

                 3A                                         3B

                         4A                                          4B

                                  5A                                         5B

1A,1B,2A,2B等为分组标记,数字相同的表示在同一组,大写字母表示是该组的第几个元素, 每次对同一组的数据进行直接插入排序。即分成了五组(49, 13) (38, 27) (65, 49)  (97, 55)  (26, 4)这样每组排序后就变成了(13, 49)  (27, 38)  (49, 65)  (55, 97)  (4, 26),下同。

第二次 gap = 5 / 2 = 2

排序后

13   27   49   55   4    49   38   65   97   26

1A             1B             1C              1D            1E

        2A               2B             2C             2D              2E

第三次 gap = 2 / 2 = 1

4   26   13   27   38    49   49   55   97   65

1A   1B     1C    1D    1E      1F     1G    1H     1I     1J

第四次 gap = 1 / 2 = 0 排序完成得到数组:

4   13   26   27   38    49   49   55   65   97

实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _009_希尔排序
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] data = new int[] { 42, 20, 75, 62, 24, 18, 8, 14, 35, 57, 18 };
            ShellSort(data);
            for (int i = 0; i < data.Length; i++)
            {
                Console.Write(data[i] + " ");
            }
        }
        public static void ShellSort(int[] dataArray)
        {
            int gap = dataArray.Length/2;
            while (gap>=1)
            {
                // 把距离为 gap 的元素编为一个组,扫描所有组
                for (int i = gap; i < dataArray.Length; i++)
                {
                    int iValue = dataArray[i];
                    int j = i - gap;
                    // 对距离为 gap 的元素组进行排序
                    while (j>=0 && dataArray[j]>iValue)
                    {
                        dataArray[j + gap] = dataArray[j];
                        j -= gap;
                    }
                    dataArray[j + gap] = iValue;
                }
                gap = gap / 2; // 减小增量
            }
        }
    }
}

 

原文地址:https://www.cnblogs.com/rongweijun/p/8143378.html