数组排序(4) 希尔排序

目录

       简介

       算法思想

       代码实现

       时间复杂度


简介:

     希尔排序属于插入类排序,是升级版的插入排序,是将整个有序序列分割成若干小的子序列分别进行插入排序。

算法思想:

  1. 首先初始化增量,根据把数组分成若干个小数组,然后对小数组做插入排序。

  2. 增量变为原先的一半,继续第一步。

  3. 继续第二步,直到增量为0。(增量为1就相当于整个数组做了插入排序)

 

     例如,一个长度为32的乱序数组需要排序。

     第一步先把它分成16组,每组2个整数,分别做插入排序。

     第二步再把经过第一趟排序后的32个整数分成8组,每组4个整数,分别做插入排序。

     第三步再把经过前两趟排序后的32个整数分成4组,每组8个整数,分别做插入排序。

     第四步再把经过前三趟排序后的32个整数分成2组,每组16个整数,分别做插入排序。

     第五步再把经过第一趟排序后的32个整数分成1组,每组32个整数,做插入排序。

代码实现:(Java)

public static void ChilleSort(int arr[]) {
    //增量increment初始化为数组长度的一半
	for (int increment = arr.length >> 1; increment > 0; increment /= 2) {
        //根据increment分成一个个小组,做插入排序
		for (int i = increment; i < arr.length; i++) {
			// 将arr[i]插在正确的位置上
			insert(arr, increment, i);
		}
	}
}

private static void insert(int[] arr, int increment, int i) {
	for (; i >= increment; i -= increment) {
		if (arr[i] < arr[i - increment]) {
            //交换两个数据
			swap(arr, i, i - increment);
		} else
            //找到了arr[i]的位置
			break;
	}
}

private static void swap(int[] arr, int i, int increment) {
	int num = arr[i];
	arr[i] = arr[increment];
	arr[increment] = num;
}

时间复杂度:

     最外层for循环需要执行logn次,第二层for循环需要执行(n-increment)次,最里层for循环最坏情况需要执行n次,最好的情况只需要执行一次,因此时间复杂度为O\left ( n log n\right )O(n^{2}),平均时间复杂度大致是O(n \sqrt{n})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值