【数据结构与算法】-【排序:希尔排序】

希尔排序

1.基本思路

将整个无序列分割成若干小的子序列分别进行插入排序,不断缩子序列跨度,至跨度为1,最后执行一次插入排序。

2.代码实现

/*
 * 希尔排序:先取一个小于n的整数d1作为第一个增量,
 * 把文件的全部记录分成(n除以d1)个组。所有距离为d1的倍数的记录放在同一个组中。
 * 先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,
 * 直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。 
 */
 
/*
 * 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序    
 * 排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,
 * 组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1, 即所有记录放进一个组中排序为止    
 * 初始:d=5   49 38 65 97 76 13 27 49 55 04    
 * 49 13   |-------------------|    
 * 38 27     |-------------------|    
 * 65 49   |-------------------|    
 * 97 55     |-------------------|    
 * 76 04   |-------------------|    
 * 一趟结果   13 27 49 55 04 49 38 65 97 76    
 * d=3    13 27 49  55 04 49 38 65 97 76    
 * 13 55 38 76 |------------|------------|------------|    
 * 27 04 65 |------------|------------|    
 * 49 49 97 |------------|------------|   
 * 二趟结果  13 04 49* 38 27 49 55 65 97 76    
 * d=1   13 04 49 38 27 49 55 65 97 76
 *    |----|----|----|----|----|----|----|----|----|    三趟结果   
 * 04 13 27 38 49 49 55 65 76 97
 */

public class ShellSort  {

	public static void sort(int[] data) {
		//不断缩小子序列分组跨度
		for (int i = data.length / 2; i > 2; i /= 2) {
			//每个子序列首元素起始进行插入排序
			for (int j = 0; j < i; j++) {
				insertSort(data, j, i);
			}
		}
	}
	
	private static void insertSort(int[] data, int start, int inc) {
		//对每个子序列组进行插入排序
		for (int i = start + inc; i < data.length; i += inc) {
			//插入排序
			for (int j = i; (j >= inc) && (data[j] < data[j - inc]); j -= inc) {
				int temp = data[j];
				data[j - inc] = data[j];
				data[j] = temp;
			}
		}
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值