希尔排序:优化版的直接插入排序
希尔排序(缩小增量法)
中心思想
先选定一个数组,把待排序的数据分为gap个组,将所有距离为gap的数据记录在
同一个组内,并对每一组内的记录进行排序,然后取(gap/3)+1,再进行上述操作。
当gap > 1时都是预排序,目的是让数组更接近于有序。
当gap == 1时,数组已经接近有序的了
取(gap/3)+1,重复该操作
代码实现:
(交换思想)
void ShellSort(int* a, int n)
{
int gap = 5;
while (gap > 1)
{
gap = (gap / 3) + 1;
for (int i = 0; i < n - gap - 1; i++)//确定范围
{
int end = i;
while (end >= 0)
{
//比较第end和第end+gap的数的大小,将小的放在前面
if (a[end] > a[end + gap])
{
int tmp = a[end];//直接进行交换
a[end] = a[end + gap];
a[end + gap] = tmp;
end -= gap;//对同一组的数进行排序
}
else
break;
}
}
}
}
(挖洞思想)
void ShellSort1(int* a, int n)
{
int gap = 5;
while (gap > 1)
{
gap = (gap / 3) + 1;
for (int i = 0; i < n - gap; i++)
{
int end = i;
int tmp = a[end + gap];//设置一个新指针来储存原来在end+gap位置的数据
while (end >= 0)
{
if (a[end] > tmp)
{
a[end + gap] = a[end];//注意一定要a[end]赋值给a[end+gap]
end -= gap;//对同一组的数进行排序
}
else
break;
}
a[end + gap] = tmp;//给原来的a[end]处赋值为原来的a[end+gap]
}
}
}
代码实现
int main()
{
int a[] = { 9,1,2,5,7,4,8,6,3,5};
int n = sizeof(a) / sizeof(a[0]);
HeapSort1(a, n);
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
system("pause");
return 0;
}
特点
1.希尔排序是对直接插入排序的优化。
2.时间复杂度: O(N1.3—N2) 。
3.空间复杂度:O(1)。
4.稳定性:不稳定。