1.希尔排序
希尔排序实际上是一种插入排序的优化,希尔排序的目的是先进行预排序,使数组更加的有序,将需要排序的数组分成n/gap个大小为gap的子数组,对子树组进行插入排序。
当gap等于1时,就相当于直接插入排序了。
例如: 9 8 7 6 5 4 3 2 1 排升序
直接插入排序需要 45次
用希尔排序
2.代码展示
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void ShellSort(int* arr, int n)
{
int gap = n;
while (gap > 1)
{
gap = gap / 3+1 ; //保证最后一次是1
for (int i = 0; i < n - gap; ++i)
{
int end = i;
int tmp = arr[end + gap];
while (end >= 0) //直到找到合适的位置,再插入
{
if (arr[end] > tmp)
{
arr[end + gap] = arr[end];
end -= gap;
}
else
{
break;
}
arr[end + gap] = tmp;
}
}
}
}
void Print(int* arr, int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = { 9,1,12,3,5};
int n = sizeof(arr) / sizeof(arr[0]);
ShellSort(arr, n);
Print(arr, n);
system("pause");
return 0;
}
3.结果展示
4.复杂度分析
时间复杂度: O(N1.3—N2)
空间复杂度为: O(1)
5.心得体会
实现希尔排序的时候,通过查资料发现gap=3比较合理,但是我忘记一定要保证最后gap最小值为1,导致实现出现了问题。这个排序也比较简单,我们要理解分组的原因,而且这里处理非常的巧妙,不用分开用循环去遍历,因为数据是连接存储的,所以我们将数组放在一起,一次循环就完成了。