排序算法之希尔排序(缩减增量排序)

希尔排序原理

希尔排序通过比较相距一定间隔的元素来工作;各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止.

希尔排序增量序列

希尔排序使用一个序列h_{1},h_{2},······,h_{n},叫做增量序列.在使用增量h_{k}的一趟排序之后,对于每一个i我们都有a[i]<=a[i+h_{k}](此时不等式是有意义的);所有相隔h_{k}的元素都被排序.希尔排序的一个重要性质是,一个h_{k}排序的文件保持它的h_{k}排序性,否则该算法就没有什么价值了.

原始数组 81 94 11 96 12 35 17 95 28 58 41 75 15
5排序之后 35 17 11 28 12 41 75 15 96 58 81 94 95
3排序之后 28 12 11 35 15 41 58 17 94 75 81 96 95
1排序之后 11 12 15 17 28 35 41 58 75 81 94 95 96

希尔排序策略

h_{k}排序的一般做法是,对于h_{k},h_{k+1},······,N-1中的每一个位置i,把其上的元素放到i,i-h_{k},i-2h_{k},······中的正确位置上.虽然这并不影响最终结果,但通过仔细观察可以发现,一趟h_{k}排序的作用就是对h_{k}个独立的子数组执行一次插入排序.

增量序列的选择

增量序列的好坏关系到算法的好坏,增量序列的一个流行(但是不好)的选择是使用Shell建议的序列:h_{t}=「N/2」和h_{k}=「h_{k+1}/2」,下面的代码是使用该增量序列的实现.

希尔排序代码实现

	
	public void shellSort(int[] arr){
		int j;
		for(int gap = arr.length/2;gap>0;gap/=2){
			for(int i = gap;i=gap&&temp

时间复杂度

定理:使用希尔增量时希尔排序的最坏情形运行时间为\Theta (N^{2}).

定理:使用Hibbard增量的希尔排序的最坏情形运行时间为\Theta (N^{\frac{3}{2}}).

空间复杂度

希尔排序的空间复杂度为O(1).

你可能感兴趣的:(算法)