希尔排序基于插入排序的快速的排序算法,对于大规模乱序数组插入排序很慢,希尔排序不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序.
希尔排序的思想是:**使数组中任意间隔为h的元素都是有序的。这样的数组被称为h有序数组。**换句话说,一个h有序数组就是h个互相独立的有序数组编制在一起组成的一个数组
C/C++实现
void ShellSort(int a[], int size)
{
int h = 1;
while (h < size / 3) h = 3 * h + 1; ///找到最大的h 1 4 13 40 121 364 1093....
while (h >= 1)
{
for (int i = h; i < size; i++)
for (int j = i; j >= h && a[j] < a[j - h]; j -= h)
{
int temp = a[j];
a[j] = a[j-h];
a[j-h] = temp;
}
h = h / 3;
}
}
比如 9,10,3,5,2,4,1,6,7
每次交换的过程如下:
2 10 3 5 9 4 1 6 7
2 4 3 5 9 10 1 6 7
2 4 1 5 9 10 3 6 7
2 4 1 5 7 10 3 6 9
2 1 4 5 7 10 3 6 9
1 2 4 5 7 10 3 6 9
1 2 4 5 7 3 10 6 9
1 2 4 5 3 7 10 6 9
1 2 4 3 5 7 10 6 9
1 2 3 4 5 7 10 6 9
1 2 3 4 5 7 6 10 9
1 2 3 4 5 6 7 10 9
1 2 3 4 5 6 7 9 10
C#实现
public static void ShellSort(int []a)
{
int h = 1;
while (h < a.Length / 3) h = 3 * h + 1; ///找到最大的h 1 4 13 40 121 364 1093....
while (h >= 1)
{
for (int i = h; i < a.Length; i++)
{
for (int j = i; j >= h && a[j] < a[j - h]; j -= h)
{
int temp = a[j];
a[j] = a[j - h];
a[j - h] = temp;
Show(a);
Console.Write('\n');
}
}
h = h / 3;
}
}