希尔排序-java实现

匿名 (未验证) 提交于 2019-12-02 21:40:30
版权声明:本文为博主原创文章,未经博主允许不得转载。 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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!