希尔排序

 希尔排序:希尔排序的主要思想为设定一个间距gap,从下标0到下标为gap开始,将待排数组以gap为间距分成gap组于各自位上进行插入排序,然后缩小gap值,再进行重复操作直至gap值为1时排序完成。总的来说希尔排序是在直接插入排序的基础之上所做的优化,通过对待排序序列的划分小规模子序列进行插入排序,然后在最后一步的直接插入排序的过程做一些小的微调即完成排序,提高了效率。

例如对于待排序数组:39,44,1,0,8,66,23,67,9,15,100,70,22,3,6,54


第一轮:gap=16/2=8(以间距为8划分子序列):

子序列:(39,9)(44,15)(1,100)(0,70)(8,22)(66,3)(23,6)(67,54)
结果:9 15 1 0 8 3 6 54 39 44 100 70 22 66 23 67


第二轮:gap=8/2=4(以间距为4划分子序列):

子序列:(9,8,39,22)(15,3,44,66)(1,6,100,23)(0,54,70,67)
结果:8 3 1 0 9 15 6 54 22 44 23 67 39 66 100 70

 

第三轮:gap=4/2=2(以间距为2划分子序列):

子序列:(8,1,9,6,22,23,39,100)(3,0,15,54,44,67,66,70)

结果:1 0 6 3 8 15 9 44 22 54 23 66 39 67 100 70

 

第四轮:gap=2/2=1(以间距为1划分子序列):

(1 0 6 3 8 15 9 44 22 54 23 66 39 67 100 70)

结果:0 1 3 6 8 9 15 22 23 39 44 54 66 67 70 100

package sort;

public class ShellSort {//希尔排序
	public static void main(String args[])
	{
		int[] array = {39,44,1,0,8,66,23,67,9,15,100,70,22,3,6,54};
		for(int gap=array.length/2;gap>0;gap/=2)//设置间距,通常为二分
		{
			for(int i=gap;i<array.length;i++)
			{
				for(int j=i;j>=gap;j-=gap)//组内比较
				{
					if(array[j]<array[j-gap])
					{
						int temp=array[j];
						array[j]=array[j-gap];
						array[j-gap]=temp;
					}
				}
			}
		}
		for(int a:array)
		{
			System.out.print(a+" ");
		}
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值