uanghaou

导航

希尔排序

希尔排序基本思想

希尔排序(Shell Sorting)是1959年由D.L.Shell提出来的,是对直接插入排序的一种改进。

希尔排序是先将整个待排序记录序列分割成若干个字序列,每个子序列由相隔某个“增量”的记录组成的,对每个子序列分别进行直接插入排序,待整个序列中的记录基本有序(增量足够小)时,再对全部记录进行一次直接插入排序。在希尔排序的过程中,需要不断缩小增量来将待排序序列分割成不同的子序列,因此又称为缩小增量排序。

排序过程

  1. 设增量用dk表示,一般设初始值dk = N/2,N为序列中记录个数,即先把所有距离为dk的记录分成一个子序列,整个记录序列被分割成了dk个子序列,并分别对个各子序列进行直接插入排序;

  2. 然后缩小增量dk,一般取dk = dk/2,重复前面的分割子序列和插入排序;

  3. 重复上述步骤,直到取dk = 1(即增量为1)为止,这时所以的记录作为一组进行一次直接插入排序,即得到有序序列。

算法实现

public int[] shellSorting(int[] arr){
    int len = arr.length;
    for(int dk = len/2;dk>0;dk /= 2){
        for(int i = dk;i<len;i++){
            int key = arr[i];
            int j = i -dk;
            while (j >=0 && arr[j] > key){
                arr[j+dk] = arr[j];
                j -= dk;
            }
            arr[j+dk] = key;
        }
    }
    return arr;
}

/**
 * 测试希尔排序
 */
@Test
public void TestShellSorting(){
    int[] arr = new int[]{8,1,5,2,4,10,3,6,9,7};
    for (int i : shellSorting(arr)) {
        System.out.print(i+" ");
    }
}

算法分析

- -
时间效率 O( n^(3/2) )
空间效率 O(1)
稳定性 不稳定

posted on 2020-09-07 16:50  uanghaou  阅读(243)  评论(0编辑  收藏  举报