插入排序之希尔排序
希尔排序的基本思想是分组的直接插入排序。由直接插入排序可知,若序列越接近有序,时间效率越高;再者,当n较小时,时间效率也较高。希尔排序正是基于这两点对直接插入排序算法进行改进。
算法描述:(1)分组,将序列分成若干组,每组由相隔一定增量的元素组成,在一个组内采用直接插入排序进行排序。(2)增量,初值是长度的一半,以后每趟增量减半,直至为1。增量减少,从而组数也减少,但组内元素增多,数据序列逐渐有序。
序列{38,55,65,97,27,76,27,13,19}的希尔排序刚才如下图所示:
希尔排序算法代码如下:
public class ShellSort {
public static void shellSort(int[] keys) {
for (int delta = keys.length / 2; delta > 0; delta /= 2) {// 控制趟数,每趟增量减半
for (int i = delta; i < keys.length; i++) {// 每组进行插入排序
int temp = keys[i];
int j;
for (j = i - delta; j >= 0 && temp < keys[j]; j -= delta) {// 找到插入位置
keys[j + delta] = keys[j];
}
keys[j + delta] = temp;//插入数据
}
}
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int[] n = new int[10];
for (int i = 0; i < n.length; i++) {
n[i] = s.nextInt();
}
shellSort(n);//调用希尔排序算法
for (int i = 0; i < n.length; i++) {
System.out.print(n[i] + " ");
}
}
}
希尔排序算法增量的变化规律有多种方案。上述减半是一种方案,一旦确定增量的变化规律,则一个数据序列的排序趟数也就确定了。
在希尔排序中,相等的两个数有可能不在同一组中,所以两个数会错过比较,那么希尔排序算法就是不稳定的。
希尔排序算法时间复杂度是O(nx(log2n)2),空间复杂度O(1),不是稳定的排序。