希尔排序超详解及其java实现

希尔排序虽然已经十分古老了,但其思想确实十分值得我们学习,非常的巧妙

虽然很多资料说希尔排序是叫shell的人提出来的,我个人却十分好奇,shell的英文好意为壳的意思,感觉希尔排序的思想就像一层层的壳一样,从内到外越来越大,当然这是我胡诌的,具体原理如下(用的一个实例进行说明的):

原理:

以数组{2,7,4,1,5,3,8,6,9,11,10}为例进行说明:

一般来说步长为除以2,有的人也选为除以3,思路都是一样的

这里的插入排序是如何实现的呢?插入排序的思路很简简单,这是在这里的插入排序是存在步长的,除了最后步长为1时,是真正意义上的插入排序,思路如图:

可能在步长很小的时候,比如1或者2时,会存在这样的疑问,为什么不选取下标最大的那个作为起点,实际上选取gap作为起点有不是好处,比如说,在i逐渐增加的过程中,实际上越往后,之前的子数列是有序的了,因为之前已经给其排序了的。如果还不明白,可以看下如下代码:

package order;

import java.util.Arrays;

public class shellSort {

	public static void shellSort_(int[] arr) {
		//步长
	for (int gap = arr.length/2; gap>0; gap/=2) {
		//start用于指定起点在下标gap处
		for (int start=gap; start< arr.length; start++) {
			int index=start-gap;
			for (; index>=0; index-=gap) {
				//比较大小
				if (arr[index]>arr[start]) {
					//交换
					int temp=arr[index+gap];
					arr[index+gap]=arr[index];
					arr[index]=temp;
				}else {
					break;
				}
			}
		}
		
	}
		
	}
		
	public static void main(String[] args) {
		int[] arr= {2,7,4,1,5,3,8,6,9,11,10};
		shellSort_(arr);
		System.out.println(Arrays.toString(arr));
	}
	
}

运行结果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

猜你喜欢

转载自blog.csdn.net/zhou_438/article/details/83715455