#include<stdio.h>
/**基于插入排序修改的希尔排序**/
void InsertSort(int k[], int n)
{
int i, j, temp;
int gap = n; //本来跨度是一,现在我们将跨度变成n; 初始化为n。
do
{
gap = gap/3 + 1;
for(i = gap; i< n; i++) //将i=1修改为i=gap;
{
if (k[i]<k[i-gap]) //每次修改都是i-gap
{
temp = k[i];
for(j=i-gap; k[j]>temp; j -=gap) //前一个元素变成gap之前。如果temp元素小于gap之前那么就将
{
k[j+gap]=k[j];
}
k[j+gap] = temp;
}
}
}while(gap >1);
}
int main()
{
int i, a[10] = {5,2,6,0,3,4,1,4,8};
InsertSort(a,10);
for(i = 0;i<10;i++)
{
printf("%d\n",a[i]);
}
return 0;
}
希尔排序的画法是如何呢?
希尔排序仅仅是高级一点的插入排序而已。
考题上只直到画第一趟就OK了。按照增量来比较和插入排序一样!
i = 1 增量是4 那么 j = 5. 循环着排。
那么空间复杂度就是O(1)
时间复杂度 书上说的是n(log2n)^2