您的位置:首页 > 运维架构 > Shell

[算法] shell sort

2015-09-03 10:34 483 查看
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] /article/5061543.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: