快速简单理解——希尔排序

21 篇文章 0 订阅
20 篇文章 0 订阅

希尔排序:

       也是属于插入排序的一种;

       所以它同样拥有插入排序的规律:


下面是网上最常见的插入排序的动图,你能看出什么规律来吗?(关于对插入排序的分析,请看我的另一篇《 简单快速掌握——直接插入排序》,就在这篇文章的后面~)

                                                    


看看你得出的规律是否跟我得出的规律一样?请往下看:



仔细看图,我们可以得出一个规律:

                1红色框的元素,是最新的一个数,在这里我们不妨叫它a【i】,(i从0到n-1),并把它放在temp里。

                2temp元素每次都与前面的元素a【j】比较,这里我们用j代替(j=i-i)。

                3temp<a【j】时:a【j】就向后移动;由原来下标a【j】变成了a【j+1】。也就是a【j+1】=a【j】。并且一直比较。

                4.直到temp>a【j】的时候,这个时候,a【j】不需要向后移动;这时候temp就直接插入到a【j】的后面,也就是a【j+1】。即a【j+1】=temp

              

接下来我们一起来写代码吧:

    public void cr(int a[],int n){
    	 for(int i=0;i<n;i++){
    		 int j=i-1;
    		 int temp=a[i];//这是我们找出规律1

    		 while(j>=0 && temp<a[j]){//temp不断地一直与前面的数a【j】作比较。这是规律3
    			 a[j+1]=a[j];
    			 j--;
    		 }
    		 a[j+1]=temp;//当temp>a【j】时,就把temp插入到a【j+1】里。这是规律4

    	 }
     }
       那么希尔排序又是又怎样的规律呢?

     下面是网上最常见的希尔排序过程的动图,你能看出什么规律来吗?

     

仔细看图,我们可以得出一个规律:

                1每个数a【i】,(i从0到n-1)都会与前面一定距离(这个距离的值我们暂且用gap表示)的数a【i-gap】做比较,并把它放在temp里。temp=a【i】;(当然i-gap必须>=0,小于0;自然就不比较了;具体可以看我下面的图解)

                2temp元素每次都与前面的元素a【j】比较,这里我们用j代替(j=i-gap)。

                3temp<a【j】时:a【j】就向后移动;由原来下标a【j】变成了a【j+gap】。也就是a【j+gap】=a【j】。并且一直比较。

                4.直到temp>a【j】的时候,这个时候,a【j】不需要向后移动;这时候temp就直接插入到a【j】的后面,也就是a【j+gap】。即a【j+gap】=temp

                5我们会发现,它的规律与插入排序的区别,就是a【i】与前面的比较。而这个数,不再是1的距离,而是gap的距离gap的变化是:第一次:gap=n/2,第二次:gap=gap/2;第三次:gap=gap/2;……;gap不断地变小,直到gap=1;


接下来我们一起来写代码吧:

   public void xier(int a[],int n){
    	int gap=n/2;
    	for(;gap>0;gap=gap/2){//这是我们发现的规律5.
    		for(int i=0;i<n;i++){
    			int temp=a[i];
    			int j=i-gap;
    			while((j>=0)&&(temp<=a[j])){//temp不断地一直与前面的数a【j】作比较。这是规律3
    				a[j+gap]=a[j];
    				j=j-gap;
    			}
    			a[j+gap]=temp;//当temp>a【j】时,就把temp插入到a【j+gap】里。这是规律4
    			}
    		}
    		
    	}
   
     }


希尔排序的代码:


插入排序的代码:


区别已经很明显了吧。

就是这样,这就是我对希尔排序与插入排序的理解。

谢谢阅读。
                        




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值