部分内容转自-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; // 减小增量 } } } }