希尔排序虽然已经十分古老了,但其思想确实十分值得我们学习,非常的巧妙
虽然很多资料说希尔排序是叫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]