Java希尔排序浅析

希尔排序:

希尔排序又叫缩小增量排序,是插入排序的一种(或者说是插入排序的改进版)。
算法描述:希尔排序通过将一组数据按照一定的增量对数据进行分组,对分组后的每组数据进行插入排序,实现了相隔较远的数据之间的排序,在不断进行插入排序的过程中,整组数据越来越接近有序,最后增量为1时,就是一次完整的插入排序了。可能有人会问,既然都是插入排序,为什么还要特地将希尔排序分出来呢?这是因为插入排序在对一组有序程度越高的数据进行排序时效率越高,所以希尔排序的时间复杂度突破了O(n2),而且希尔排序的时间复杂度会随着增量取值的不同而不同。

代码实现:(以常用的增量设置举例)

public class ShellSort {
	// 希尔排序(缩小增量排序):将整组数据按照增量分组,对每一组数据进行插入排序,使得整组数据越来越接近有序,增量为1作为结束的标志,执行最后一次插入排序后结束希尔排序
	public static int[] shell(int[] arr) {
		// 如果数组是null或者数组元素只有一个直接返回
		if (arr == null || arr.length == 1) {
			return arr;
		}
		// 设置希尔增量
		int len = arr.length / 2;
		while (len > 0) {
			for (int i = len; i < arr.length; i++) {
				// 标记要插入的新数据
				int temp = arr[i];
				int j;
				// j是按照希尔增量分组后i之前的数据
				// 当j<0或者遇到比新元素temp小的数据时循环结束
				for (j = i - len; j >= 0 && arr[j] >= temp; j -= len) {
					if (arr[j] > temp) {
						arr[j + len] = arr[j];
					}
				}
				arr[j + len] = temp;
			}
			len /= 2;
		}
		return arr;
	}
	public static void main(String[] args) {
		int[] arr = new int[] { 1, 6, 4, 8, 3, 10 };
		int[] arr1 = new int[arr.length];
		arr1 = shell(arr);
		for(int i=0;i<arr.length;i++) {
			System.out.print(arr1[i]+" ");
		}
	}
}
	
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值