希尔排序是基于插入排序而改进的排序方法。它将数据分为多组,再对各组使用插入排序。
分组依据是增量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;
}
}
}