希尔排序也叫做shell排序或缩小增量排序,听说是一个叫D.L.Shell的人发明出来的,顾取名shell排序。这种排序是基于插入排序思想的,也比较适用于数据量大时。算法
我刚开始看到时候对于插入排序也是半瓶子醋,直接致使我看不懂了,抓狂,so...我就去默默的补习一下插入排序喽。shell
插入排序的核心思想是比较和插入,就是从第二个数开始,依次插入到前面合适的位置。排序步骤以下:数组
1. 首先对数组的前两个数据进行从小到大的排序 2. 接着将第3个数据与排序好的两个数据进行比较,插入合适的位置 3. 而后,将第4个数据插入已经排好的前3个数据中 4. 不断重复上述的过程,完成排序
private void insertSort(int[] a) { int i,j,t,h; for(i =1;i<a.length;i++) { t = a[i]; j = i-1; while(j>=0&&t<a[j]) { a[j+1] = a[j]; j--; } a[j+1] = t; System.out.println("第"+i+"步排序:"+Arrays.toString(a)); } }
简单的介绍了一下插入排序,下面就讲一下这个希尔排序。code
1.将有n个元素的数组分为n/2个数字序列,第1个数据和第n/2+1个数据为一对。。。 2.一次循环使每个序列对排好顺序(对每一个序列使用插入排序算法,实质是一种分组插入) 3.而后,再变为n/4个序列,再次排序 4.不断重复上述过程,随着序列减小最后变为一个,也就完成了整个排序。
好比对{12,31,11,20,17,30}进行希尔排序:排序
1. 第一次排序,首先将数组分为6/2=3个数字序列,第一个数据12和第四个数据20为一对,第二个数据和第五个数据为一对,第三个数据和第六个数据为一对,每一对进行排序后数据为:12,17,11,20,31,30 2. 第二次排序,将数组划分为6/4=1(这里取整),此时逐个对数据比较,按照插入排序算法进行排序,排序后的数据为:11,12,17,20,30,31
private void shellSort(int[] a) { int i,j,h; int r,temp; int x = 0; for(r = a.length/2;r>=1;r/=2) { for(i = r;i<a.length;i++) { temp = a[i]; j = i -r; while(j>=0&&temp<a[j]) { a[j+r] = a[j]; j-=r; } a[j+r] = temp; } x++; System.out.println("第"+x+"步排序:"+Arrays.toString(a)); } }
至此希尔排序就完成了,时间复杂度为O(nlog2n).循环