希尔排序,又称缩小增量排序,是对插入排序的优化。那么缩小增量是怎么体现出来的呢?前面我们讲过的插入排序,是直接对一组数据进行操作,这样会慢很多;希尔排序会按照一定的间隔把数组分为几段,比如说现在有一个数组array[] = {2,3,6,8,9,4,7,1,5},我们先以3为间隔把数组分为三组,那么分好之后的三组数据分别为{2,8,7}、{3,9,1}、{6,4,5},对分好的数据,利用插入排序的思想对他们进行排序。各组排好之后,每组内就有序了分别为{2,7,8}、{1,3,9}、{4,5,6},这九个数字整体就接近有序了。我们再来对这九个数字进行分组排序,这时候,我们以2为间隔对他来进行分组,这个时候缩小增量就体现出来了,分好的组为{2,8,3,4,6}、{7,1,9,5},再按照插入排序对他们进行排序,排好之后为{2,3,4,6,8}、{1,5,7,9}。然后再缩小增量为1进行插入排序,这次就排好了。
#include <stdio.h>
#include <assert.h>
#include <windows.h>
void PrintArray(int* array, int size)
{
int i = 0;
for(; i < size; i++)
printf("%d ", array[i]);
printf("\n");
}
void Swap(int* pLeft, int pRight)
{
int temp = 0;
assert(pLeft);
assert(pRight);
temp = *pLeft;
*pLeft = *pRight;
*pRight = temp;
}
voif ShellSort(int* array, int size)
{
int i = 1;
int gap = size;
while(gap > 1)
{
gap = gap/3 + 1;
for(i = gap; i < size; ++i)
{
int key = array[i];
int end = i - gap;
while(end >= 0 && key < array[end])
{
array[end+gap] = array[end];
end -= gap;
}
array[end+gap] = key;
}
}
}
void TestSort()
{
int array[] = {2, 5, 4, 9, 3, 6, 8, 7, 1, 0};
PrintArray(array, sizeof(array)/sizeof(array[0]));
ShellSort(array, sizeof(array)/sizeof(array[0]));
PrintArray(array, sizeof(array)/sizeof(array[0]));
}
int main()
{
TestSort();
system("pause");
return 0;
}