算法描述
希尔排序是插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。
具体描述如下:
假如有一个大小为n数组,一般取一个增量d=n/2,将数组的元素进行分组。 所有距离为d的倍数的元素被分到一组中,先在各组内进行直接插入排序。再取第二个增量d2重复上述分组和排序,直至所取增量为1,此时所有记录放在同一组中进行直接插入排序。
2.但插入排序每次只能将数据移动一位,乱序时是低效的。
希尔排序的时间复杂度与增量的选取有关,希尔排序时间复杂度的下界是n*log2n。希尔排序没有快速排序算法O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择。但是比O(n^2)复杂的算法快得多。
希尔排序是插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。
具体描述如下:
假如有一个大小为n数组,一般取一个增量d=n/2,将数组的元素进行分组。 所有距离为d的倍数的元素被分到一组中,先在各组内进行直接插入排序。再取第二个增量d2重复上述分组和排序,直至所取增量为1,此时所有记录放在同一组中进行直接插入排序。
改进的目的基于以下两点:
1.插入排序在对几乎已经排好的数据操作时,效率高,此时为线性排序的效率。2.但插入排序每次只能将数据移动一位,乱序时是低效的。
例如:
假设一个数组为 49, 38, 65, 97, 76, 13, 27, 49, 55, 04
增量的取值依次为5, 3, 1
----------------------------------------------------------------------------------
初始序列:49 38 65 97 76 13 27 49 55 04
增量5分组:(49,13) (38,27) (65,49) (97,55) (76,04)
一趟排序后:13 27 49 55 04 49 38 65 97 76
增量3分组:(13,55,38,76) (27,04,65) (49,49,97)
二趟排序后:13 04 49 38 27 49 55 65 97 76
增量1分组:13 04 49 38 27 49 55 65 97 76
三趟排序后:04 13 27 38 49 49 55 65 76 97
-----------------------------------------------------------------------------------
例程
void Shell_sort(int a[], int n)
{
int i, j, Increment, temp;
for (Increment = n / 2; Increment > 0; Increment /= 2) {
for (i = Increment; i < n; i++) {
temp = a[i];
for (j = i; j >= Increment; j -= Increment) {
if (a[j - Increment] > temp)
a[j] = a[j - Increment];
else
break;
}
a[j] = temp;
}
}
}
int main()
{
int b[] = { 9,8,19,4,6,2,3,7,4 };
Shell_sort(b, 9);
for (auto c : b)
cout << c << " ";
system("pause");
}
插入排序的时间复杂度分析
希尔排序的时间复杂度与增量的选取有关,希尔排序时间复杂度的下界是n*log2n。希尔排序没有快速排序算法O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择。但是比O(n^2)复杂的算法快得多。