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

542 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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

希尔排序思想:

按照增量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; 
			}		
		}
	}
}

运行效果截图:

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

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