希尔排序-java实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/lixin88/article/details/91812666