希尔排序是基于插入排序而改进的排序方法。它将数据分为多组,再对各组使用插入排序。
分组依据是增量d,一般增量是 排序元素的长度/2,调用一次插入排序,再继续除2,再调用一次插入排序,再d/2.......直到d <1
希尔排序的时间复杂度为:O(n平方)
思路:
如有下列10个带排序元素:
增增量d = 10/2 = 5,即每隔开5个元素的元素为一组,如下图:
然后调用1次插入排序,再令d/2 = 5/2 = 2 ,即每隔开2个元素的元素为一组
再调用插入排序,d再继续除2,d = 2/2 = 1,即每隔开1个元素的元素为一组,(即一共只有一组元素)
再调用插入排序:
排序完成。
代码:
public class shellSort { public static void main(String[] args) { int []a = {49,35,32,10,21,54,78}; ShellSort(a); for(int i=0;i<a.length;i++) { System.out.print(a[i]+" ");//打印结果:10 21 32 35 49 54 78 } } /*希尔排序*/ private static void ShellSort(int[] array) { int length = array.length; int d =length; while(true) { d = d/2; for(int x=0;x<d;x++) { //共有d组 /*每组都进行插入排序*/ for(int i=x+d;i<length;i=i+d) { int temp = array[i]; int j; for(j=i-d;j>=0&&array[j]>temp;j=j-d) { array[j+d] = array[j]; } array[j+d]=temp; } } if(d==1) //若是已完成增量d=1 后的排序,就退出循环 break; } } }