希尔排序(简单易懂,图文并貌,插入排序)java代码实现

举报
YuShiwen 发表于 2022/03/31 01:34:59 2022/03/31
【摘要】 希尔排序是直接插入排序算法的一种更高效的改进版本。 希尔排序思想: 按照增量d对其进行分组,每组内部分别进行直接插入排序; (如果不太懂直接插入排序的java具体实现方法,可参考本人所写另一篇博文:直...

希尔排序是直接插入排序算法的一种更高效的改进版本。

希尔排序思想:

按照增量d对其进行分组,每组内部分别进行直接插入排序;
(如果不太懂直接插入排序的java具体实现方法,可参考本人所写另一篇博文:直接插入排序
一般首先取d等于序列长度的一半,然后以后每次减半,直到增量等于1.

下面是本人用ProcessOn所绘制的排序过程图:

(以11个数为例进行说明,请大家认真分析此图,耐心一点,写得很详细,看完此图应该会有所收获)
说明:
下图中不同颜色的线代表不同的分组,例如下图中第一行黑色线相连的有426,-2,23,说明426,-2,23被分为一组,并对426,-2,23进行直接插入排序;
第一行蓝色线相连的有62 ,0说明62,0被分为一组;
同理下面的连线分组都是这样的。
作者:喻世文

java实现代码(有注释):

public void toShellSort(int []arr) {
	//增量在刚开始的时候为数组长度的一半,以后每次减半,直到增量大于0不成立
	for(int d = (int)(arr.length/2); d > 0; d = (int)(d/2)) { 
		//首先从每组的第二个数开始,第一次循环是第一组第二个数与第一个数比较,第二次循环是第二组第二个数与第二组第一个数比较
		//进行d次循环后,如果后面还有数
		//第d次循环是第一组第3个数与前面已从小到大排好序的序列比较,第d+1次循环是第二组与第3个数与前面已排好序的序列比较,
		//差不多就是对每组分别进行插入排序
		for(int i = d;i<arr.length;i++) {						
			int tempIndex = i;
			while(tempIndex - d >=0 && arr[tempIndex] < arr[tempIndex-d]) {  
				int temp = arr[tempIndex];
				arr[tempIndex] = arr[tempIndex-d];
				arr[tempIndex-d] = temp;
				tempIndex = tempIndex-d; 
			}		
		}
	}
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

运行效果截图:

在这里插入图片描述
在这里插入图片描述

种一棵树最好的时间是10年前,其次是现在,身为后浪,加油!

文章来源: blog.csdn.net,作者:Mr.Yushiwen,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/MrYushiwen/article/details/107169057

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。