java希尔排序(含希尔排序代码)

目录

一:希尔排序思想

二:希尔排序比插入排序的好处

三:希尔排序代码

四:结果


一:希尔排序思想

基本思想:希尔排序是把序列按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量的逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列恰好被分为一组,算法便终止。

算法实现:希尔排序需要定义一个增量,这里选择增量为gap=length/2,缩小增量以gap=gap/2的方式,这个增量可以用一个序列来表示,{n/2,(n/2)/2…1},称为增量序列,这个增量是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。

(1)对于一个无序序列{8,9,1,7,2,3,5,4,6,0}来说,我们初始增量为gap=length/2=5,所以这个序列要被分为5组,分别是{8,3},{9,5},{1,4},{7,6},{2,0},对这5组分别进行直接插入排序,则小的元素就被调换到了前面,然后再缩小增量gap=gap/2=2。

 (2)上面缩小完增量后,序列再次被分为2组,分别是{3,1,0,9,7}和{5,6,8,4,2},再对这两组进行直接插入排序,那么序列就更加有序了。

 (3)然后再缩小增量gap=gap/2=1,这时整个序列就被分为一组即{0,2,1,4,3,5,7,6,9,8},最后再进行调整,就得到了有序序列{0,1,2,3,4,5,6,7,8,9}。

二:希尔排序比插入排序的好处

插入排序只能一个一个往后面移动,希尔排序可以跳着步长移动,小的数很快就会到达最前面。


在这两个部分中,取步长为四,则7和4和0比较,5和3,9和6,8和2在这四个部分中,每个部分都进行一次直接插入排序。

每个小组进行完插入排序之后变成:

在比较第二轮时,我们把步长除以二,此时步长变成了2,数组变成了两组:①0,6,4,9,7 ②3,2,5,8

在每一组中继续进行直接插入排序
结果如下:

 再将步长除以2,此时步长为1,也是最后一次排序

 希尔排序最重要的就是步长,让步长不断地除以二,直到步长为1,优点是如果在数组最后加入一个小元素,他会被很快移到最前面。

三:希尔排序代码

package totoSort;

import java.util.Arrays;

public class ShellSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arrays = new int[] {1,5,2,3,6,9,4,0,1};
		//实现增量的变化
		for(int gap = arrays.length / 2; gap > 0; gap /= 2) {
			for(int i = gap; i < arrays.length; i++) {
				for(int j = i - gap; j >= 0; j -= gap) {
					if(arrays[j] > arrays[j + gap]) {
						int temp = arrays[j];
						arrays[j] = arrays[j + gap];
						arrays[j + gap] = temp;
					}
				}
			}
		}
		System.out.println(Arrays.toString(arrays));
	}
}

四:结果

  • 12
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值