希尔排序,n为数组长度,步长的选择每次都为n/2
void shellsort1 (int a[],int n)
{
for(gap=n/2;gap>=1;gap=gap/2) //步长
{
for (i = 0; i < gap; i++)
{
for (j = i + gap; j < n; j += gap) //直接插入排序
{
if (a[j] < a[j - gap])
{
int temp = a[j];
int k = j - gap;
while (k >= 0 && a[k] > temp)
{
a[k + gap] = a[k];
k -= gap;
}
a[k + gap] = temp;
}
}
}
}
}
以上理解很方便,但是嵌套了四层循环。改进代码,从第gap个元素开始,依次加一插入排序。
void shellsort2(int a[], int n)
{
int j, gap;
for (gap = n / 2; gap > 0; gap /= 2)
for (j = gap; j < n; j++)//从数组第gap个元素开始
if (a[j] < a[j - gap])//每个元素与自己组内的数据进行直接插入排序
{
int temp = a[j];
int k = j - gap;
while (k >= 0 && a[k] > temp)
{
a[k + gap] = a[k];
k -= gap;
}
a[k + gap] = temp;
}
}
改进插入排序,简化代码如下。
void shellsort3(int a[], int n)
{
int i, j, gap;
for (gap = n / 2; gap > 0; gap /= 2)
{
for (i = gap; i < n; i++)
{
for (j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap)
swap(a[j], a[j + gap]);//algorithm头文件中
}
}
}