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

希尔排序(Shell Sort)

2018-01-05 21:18 435 查看
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。

希尔排序实现:将数组列在一个表中并对列排序(用插入排序)。重复这过程,不过每次用更长的列来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身仅仅对原数组进行排序(通过增加索引的步长,例如是用
i
+= step_size
而不是
i++
)。

例如,假设有这样一组数[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我们以步长为5开始进行排序,我们可以通过将这列表放在有5列的表中来更好地描述算法,这样他们就应该看起来是这样:
13 14 94 33 82
25 59 94 65 23
45 27 73 25 39
10


然后我们对每列进行排序:
10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45


将上述四行数字,依序接在一起时我们得到:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ].这时10已经移至正确位置了,然后再以3为步长进行排序:
10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45


排序之后变为:
10 14 13
25 23 33
27 25 59
39 65 73
45 94 82
94


最后以1步长进行排序(此时就是简单的插入排序了)


C语言实现:

void shell_sort(int a[], int n) {
int i, j, temp, gap;
for (gap = n / 2; gap > 0; gap /= 2) {
for (i = gap; i < n; i++) {
temp = a[i];
for (j = i ; j > 0 && a[j-gap] > temp; j -= gap) {
a[j] = a[j-gap];
}
a[j] = temp;
}
}
}

int main() {
int a[] = { 4,8,1,2,0,2,5,6,9,7 };

shell_sort(a, 10);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 排序算法