F_G

许多问题需要说清楚就可以&&走永远比跑来的重要

导航

[算法] shell sort

public void sort(int[] list) {
    int gap = list.length / 2;
    while (1 <= gap) {
        for (int i = gap; i < list.length; i++) {
            int j = 0;
            int temp = list[i];
            for (j = i - gap; j >= 0 && temp < list[j]; j = j - gap) {
                list[j + gap] = list[j];
            }
            list[j + gap] = temp;
        }

        gap = gap / 2;    
    }
}

 shell sort,希尔排序,缩小增量排序是对插入排序的改进。

首先将待排序数据按照一定的步长gap分为多个组,针对每个组进行直接插入排序,然后缩小步长,进行上面同样的过程。

上面的程序在许多地方出现,我就原封不多呢拷过来了,包括下面的引用 [1] 当中。

为什么说是针对每个分组的插入排序?

外层 for针对每一个分组的终点,显然每一个终点只能属于一个分组。内层for当然就是对这个分组进行插入排序了

假设gap=3

下面的数字是数组当中的下标

0 1 2 3 4 5 6 7 8 9 10

这里 0 3 6 9是一个分组;2,4,7,10是一个分组;2,5,8是一个分组

首先从3开始 比较0,3

然后4,比较1,4

然后5,比较2,5

然后6,比较0,3,6 这里可以看到0,3在前面已经比较过了,所以这里只需要寻找6的插入位置即可。

然后7,比较1,4,7 这里的1,4已经比较过了,所以这里只需要寻找7的插入位置即可

然后8,比较2,5,8 这里的2,5已经比较过了,所以只需寻找8的插入位置即可

然后9,比较0,3,6,9这里0,3,6已经比较过了,所以只需寻找9的插入位置即可

然后10,比较1,4,7,10 这里1,4,7已经比较过了,所以只需寻找10的插入位置即可

 

[1] http://www.cnblogs.com/jingmoxukong/p/4303279.html

posted on 2015-09-03 10:34  F_G  阅读(346)  评论(0编辑  收藏  举报