希尔排序(Shell Sort)也称为递减增量排序算法,是插入排序的一种高速而安定的改良版。因希尔(Donald L. Shell)于1959年提出而得名。各种实现在如何进行递减上有所不同。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位
对有n个元素的可比较资料,先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-1<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法。
在具体实现上,希尔排序的性能与所选取的分组长度序列有很大关系
- #include <stdio.h>
- void shell_sort(int a[], int size)
- {
- int gap, temp;
- int i, j;
- for (gap = size / 2;gap > 0; gap /= 2) {
- for (i = gap; i < size; i++) {
- for (j = i - gap; j >= 0 && a[j] > a[j+gap]; j-=gap) {
- temp = a[j];
- a[j] = a[j+gap];
- a[j+gap] = temp;
- }
- }
- }
- }
- main()
- {
- int a[] = {49, 38, 65, 97, 76, 13, 27, 49, 55, 4}, i;
- int size = sizeof(a) / sizeof(int);
- shell_sort(a, size);
- for (i = 0; i < size; i++)
- printf("%d ", a[i]);
- }