插入排序——希尔排序算法实现与解析

希尔排序算法实现与解析

从直接插入排序的算法中我们可以明显看到,如果数据越有序,直接插入排序的效率也就会越高。
而希尔排序,就是基于这一点的一个插入排序算法。
希尔排序的基本思想是,先将数据按照一个间隔分成若干个小组,对同一小组内的数据使用直接插入排序,随后缩小小组的个数(也就是缩小间隔),反复此过程,直至间隔为1,此时整体数据变为一个小组,也就是说,当算法执行到间隔为1时,希尔排序,其实也就相当于直接插入排序了。希尔排序也称作缩小增量排序。
插入排序——希尔排序算法实现与解析_第1张图片
如图,增量(间隔)为3时,数据被分成3组,这3个小组内,采用直接插入排序进行排序
插入排序——希尔排序算法实现与解析_第2张图片
之后,不断缩小增量并排序
算法如下:
java

	public static void shellSort(int[] a, int[] d) {//a为待排序数组 d为增量数组
		int i, j, k, span, temp;
		int n = a.length;
		for (i = 0; i < d.length; i++) {// 设置增量
			span = d[i];
			for (j = 0; j < span; j++) {// 遍历所有小组
				for (k = j; k + span < n; k += span) {//对小组内进行 直接插入排序 注意,间隔为span
					temp = a[k + span];
					while (k > -1 && temp <= a[k]) {
						a[k + span] = a[k];
						k -= span;
					}
					a[k + span] = temp;
				}
			}

		}
	}

我这里的增量数组是手动设置的,其实也可以将增量数组d去掉,用初始增量设置成待排序数组长度的一半,之后每次减半的方式来代替。

希尔排序的时间复杂度分析比较复杂,与增量的设置有重要的关系。
因为进行分组排序的关系,因此相同的数据元素有可能位置发生变化,所以希尔排序是一种不稳定的排序算法。

你可能感兴趣的:(数据结构与算法,排序算法,java,数据结构,插入排序)