版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lixin88/article/details/91812666
是一种基于插入排序的快速的排序算法;对于大规模乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点地从数组 的一端移动到另一端。例如,如果主键最小的元素正好在数组的尽头,要将它挪到正确的位置就需 要 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; }
文章来源: https://blog.csdn.net/lixin88/article/details/91812666