**希尔排序的思路:
- 先让数组先进行预排序,使数组接近有序
- 然后直接插入排序**
按照上面的思路一步一步往下走,即为:
#include<stdio.h>
void ShellSort(int* a, int n)
{
int gap = n;
while (gap > 1)
{
gap = gap / 2;
//gap=gap/3+1
int i = 0;
for (i = 0; i < n - gap; i++)//注意:i<n-gap,但是i++
{
int end = i;
int tmp = a[end + gap];
while (end >= 0)
{
if (a[end]>tmp)
{
a[end + gap] = a[end];
end-=gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
}
void Print(int* a, int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
}
int main()
{
int a[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1,0 };
int n = sizeof(a) / sizeof(int);
ShellSort(a, n);
Print(a, n);
return 0;
}
这个代码中,
1.刚开始gap比较大,可以使大数更快的到数组后面,
2.然后慢慢缩小gap,使预排序越来越接近有序,当gap=1时即直接插入排序;