首先希尔排序是对插入排序的改进。
插入排序最坏情况需要O(n^2)的运行时间,如何缩短这一运行时间呢?我们利用插入排序的这样一条性质:当逆序元素的间距均不超过k时,插入排序仅需O(kn)的运行时间。
希尔排序的思想:所以希尔排序首先要做的是让序列中逆序元素间距小于等于某个较小的k,之后再用插入排序在O(kn)的时间完成所有的排序。
希尔排序的过程:
设序列为X,共有n个元素,用长度位n的数组存放。我们要对它做升序排序。
1. 取一个较大的k,将所有位于原序列1,k+1,2k+1,...位置的元素编作一组,将位于2,k+2,2k+2,3k+3,...的元素编作一,依此类推。易知,这样的组一共有n/k组,每组有k个元素。
2. 对每一组进行插入排序。
1、2两步操作合起来称为一趟希尔排序。
完成这样一趟希尔排序就能使得逆序元素间距小于等于k吗?
答案是不能。假设有这样一个序列X,我们对它做了k = 2的一趟希尔排序,排序结果是{5,1,6,2,7,3,8,4,9},显然逆序元素4和5之间的距离就超过了2。
虽然完成这样一趟希尔排序不能使得逆序元素间距小于等于k,但我们知道,k越小,系列的有序程度就越高,如果我们为每趟希尔排序合理得安排一个k值(一般是越来越小得),就能使得序列以较小的代价,逐渐趋于有序,直至完全有序。
怎样使得逆序元素间距小于等于k呢?
<