希尔排序的名称来源于它的提出者希尔,说点题外话,希尔这家伙运气还是可以的,这是唯一一个以人名命名的排序算法(仅对于常规的八大排序算法);
希尔排序的本质是对于插入排序的改进,插入排序可以理解为增量为1的排序,因为执行N次,都使得数组arr[0]、arr[1]、。。。arr[N-1]完成排序,可以看出增量为1;而希尔排序是采用的缩减增量排序,在希尔排序中增量的初始值为arr.length/2,然后根据增量进行分组,对分组之后的每一组数据进行插入排序,排序完毕之后令增量减半,直至增量为1,此时希尔排序完毕。
希尔排序的算法复杂度为,是第一批打破二次屏障的排序算法之一。
鉴于作者的文笔与表达能力有限,下面引入一张图片,图片来源于https://www.cnblogs.com/chengxiao/p/6104371.html
实现希尔排序的简单程序如下:
public static int[] shellSort(int[] arr)
{
int j;
for (int gap = arr.length / 2; gap >= 1; gap /= 2)
for (int i = gap; i < arr.length; i++)
{
int temp = arr[i];
for (j = i; j >= gap && temp < arr[j - gap]; j -= gap)
arr[j] = arr[j - gap];
arr[j] = temp;
}
return arr;
}