【排序算法】希尔排序(java实现)

1.基本思想:

希尔排序(Shell Sort)是插入排序的一种,是针对直接插入排序算法的改进。该方法又称缩小增量排序.

(1)选取一个小于n的整数d1作为第一个增量,把序列的全部元素分成d1个组。

  所有距离为d1的倍数的元素放在同一个组中,在各组内进行直接插人排序。

(2)选取第二个增量d2<d1重复上述的分组和排序。

(3)重复(2)步骤,直至所取的增量dx=1,整个数据合成为一组,构成一组有序记录,则完成排序。

一般而言,初始增量d1 选取序列长度n 的一半, 第二个增量d2 为 d1 的一半,即每次取上一次增量的一半。


2.算法分析:

时间复杂度:   最好O(N)    最坏:O(N^2)

空间复杂度:O(1)

稳定性:不稳定

3.算法实现:

在不同的增量下,排序操作是一样的——先按照增量分组,再组内进行排序,所以最外层为增量变化的循环。
在增量相同的情况下,各组组内操作相同,所以先进行分组。
最后,组内进行直接插入排序 (也可改进为折半插入排序 )。
总共3层for 循环。

	public static void ShellInsertSort(int[] array){
		int len =array.length;
		//增量
		for(int gap = len/2; gap > 0; gap/=2){
			for(int i=0; i < gap ; i++){
				//组内采用直接插入法 进行排序
				for (int j =i+gap ;j < len; j += gap){
					
					int t = array[j];
					int k =j-gap;
					while(k >= 0 && array[k] > t){
						array[k+gap] = array[k];
						k-=gap;
					}
					array[k+gap] = t;	
				}
			}
		}
	}

注:

直接插入排序是稳定的,而希尔排序不稳定

直接插入排序更适合原始记录基本有序的序列。

希尔排序的比较和移动次数均比直接插入排序少,n越大,效果越明显。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值