是一种基于插入排序的快速的排序算法;对于大规模乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点地从数组 的一端移动到另一端。例如,如果主键最小的元素正好在数组的尽头,要将它挪到正确的位置就需 要 N-1 次移动。希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部 进行排序,并最终用插入排序将局部有序的数组排序。
现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序列“基本有序”后,最后在对所有元素进行一次直接插入排序。
增量为h,则分成h个组,所有距离为h的倍数的都在一个组里,先在各组直接插入排序,
然后取第二个增量h2 重复如此;直到增量h =1;
/**
* 希尔排序
* O(N*(logN)^2)
*/
public int[] shellSort(int[] a){
if (a == null)
return null;
if (a.length ==1){
return a;
}
int inserIndex = 0;
int gap = a.length/2;
while (gap>0)
{
for (int i = gap; i < a.length; i++) {
inserIndex =i;
int temp = a[i];
while (inserIndex>=gap && a[inserIndex-gap]>temp){
a[inserIndex] = a[inserIndex-gap];
inserIndex-=gap;
}
a[inserIndex]=temp;
}
gap = gap/2;
}
return a;
}