插入排序之希尔排序

       希尔排序是一种改进的插入排序,又称为缩小增量排序,在时间效率上有了较大的改进,希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。

       算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。一般的初次取序列的一半为增量,以后每次减半,直到增量为1。也是一种不稳定的排序。

给定实例的shell排序的排序过程
假设待排序文件有10个记录,其关键字分别是:
49,38,65,97,76,13,27,49,55,04。
增量序列的取值依次为:
假设待排序文件有10个记录,其关键字分别是:
49,38,65,97,76,13,27,49,55,04。
增量序列的取值依次为:5,3,1

第一次 gap = 10 / 2 = 5

49   38   65   97   26   13   27   49   55   4

1A                     1B

     2A                     2B

         3A                     3B

              4A                     4B

                   5A                    5B

1A,1B,2A,2B等为分组标记,数字相同的表示在同一组,大写字母表示是该组的第几个元素, 每次对同一组的数据进行直接插入排序。即分成了五组(49, 13) (38, 27) (65, 49)  (97, 55)  (26, 4)这样每组排序后就变成了(13, 49)  (27, 38)  (49, 65)  (55, 97)  (4, 26),下同。

第二次 gap = 5 / 2 = 2

排序后

13   27   49   55   4    49   38   65   97   26

1A        1B       1C        1D       1E

     2A        2B       2C       2D       2E

第三次 gap = 2 / 2 = 1

4   26   13   27   38    49   49   55   97   65

1A  1B   1C   1D   1E    1F   1G  1H   1I   1J

第四次 gap = 1 / 2 = 0 排序完成得到数组:

4   13   26   27   38    49   49   55   65   97


算法:

1.外循环以各种不同的间隔距离d进行排序,直到d=1;

2.第二重循环是在某一个d值下对各组进行排序,若在某个d值下发生了记录的交换,则需要继续第三重循环;直至各组内均无记录的交换为止,即各组已经完成排序任务

3.第三重则是从第一个记录开始的,以某个d值为间隔进行组内比较。若有逆序,则进行交换。

public class Slpx {
	public static void slpx(int n[]){
		int num=n.length;
		int d=num/2;                     //设置增量
		int x,y;
		while(d>=1){	                 //以各种不同的距离d来进行排序
			for(int i=d;i<num;i++){      //从下标为d开始
				x=n[i];
				y=i-d;
				while(y>=0 && x<n[y]){    //以间隔d来往前搜索比自己小的
					n[y+d]=n[y];
					y=y-d;               //往前面进行比较
				}
				n[y+d]=x;                //进行插入
			}
			d=d/2;                       //缩小增量
		}
	}
	public static void main(String[] args) {
		int n[]={6,2,4,3,5,4,3};
		slpx(n);
		for(int i=0;i<n.length;i++){
			System.out.print(n[i]);
		}
		
	}
}



http://blog.csdn.net/morewindows/article/details/6668714  链接中有着更加详细的介绍,对希尔排序进行了一些优化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值