希尔算法

希尔排序严格来说是基于直接插入排序的思想,可以说是直接排序的优化,又称为缩小增量排序。

具体流程如下:

  1、将包含n个元素的数组,分成n/2个数组序列,第一个数据和第n/2+1个数据为一对...

   2、对每对数据进行比较和交换,排好顺序;

   3、然后分成n/4个数组序列,再次排序;

   4、不断重复以上过程,随着序列减少并直至为1,排序完成。

假如有初始数据:25  11  45  26  12  78。

  1、第一轮排序,将该数组分成 6/2=3 个数组序列,第1个数据和第4个数据为一对,第2个数据和第5个数据为一对,第3个数据和第6个数据为一对,每对数据进行比较排序,排序后顺序为:[25, 11, 45, 26, 12, 78]。

  2、第二轮排序 ,将上轮排序后的数组分成6/4=1个数组序列,此时逐个对数据比较,按照插入排序对该数组进行排序,排序后的顺序为:[11, 12, 25, 26, 45, 78]。

代码:

public void sort(int[] arr) {

    // i表示希尔排序中的第n/2+1个元素(或者n/4+1)

    // j表示希尔排序中从0到n/2的元素(n/4)

    // r表示希尔排序中n/2+1或者n/4+1的值

    int i, j, r, tmp;

    // 划组排序

    for(r = arr.length / 2; r >= 1; r = r / 2) {

        for(i = r; i < arr.length; i++) {

            tmp = arr[i];

            j = i - r;

            // 一轮排序

            while(j >= 0 && tmp < arr[j]) {

                arr[j+r] = arr[j];

                j -= r;

            }

            arr[j+r] = tmp;

        }

        System.out.println(i + ":" + Arrays.toString(arr));

    }

}

posted @ 2017-09-01 02:26  hexns  阅读(122)  评论(0)    收藏  举报