希尔排序基本思想
基本思想:
先取一个小于n的整数d 1 作为第一个增量,把文件的全部记录分成d 1 个组。所有距离为d l 的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d 2 <d 1 重复上述的分组和排序,直至所取的增量d t =1(d t <d t-l <…<d2 <d 1 ),即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。
它和插入排序的区别在于先比较距离远的元素,而不是像简单交换排序算法那样先比较相邻的元素。这样可以快速减少大量无序的情况,从而减轻后续的工作。被比较的元素之间的距离逐步减少,直到1,这时排序变成了相邻元素的互换。
Code
1 public static void ShellSort(int[] list)
2 {
3 int h = 1;
4 while (h <= list.Length / 9)
5 {
6 h = h * 3 + 1;
7 }
8 for (; h > 0; h = h / 3)
9 {
10 for (int i = h + 1; i <=list.Length; i += h)
11 {
12 int temp = list[i - 1];
13 int j = i;
14 while ((j > h) && (list[j - h - 1] >temp))
15 {
16 list[j-1] = list[j - h - 1];
17 j -= h;
18 }
19 list[j - 1] = temp;
20 }
21 }
22 }
1 public static void ShellSort(int[] list)
2 {
3 int h = 1;
4 while (h <= list.Length / 9)
5 {
6 h = h * 3 + 1;
7 }
8 for (; h > 0; h = h / 3)
9 {
10 for (int i = h + 1; i <=list.Length; i += h)
11 {
12 int temp = list[i - 1];
13 int j = i;
14 while ((j > h) && (list[j - h - 1] >temp))
15 {
16 list[j-1] = list[j - h - 1];
17 j -= h;
18 }
19 list[j - 1] = temp;
20 }
21 }
22 }