#include <stdio.h>
#include <stdlib.h>
//希尔排序
//基本思想:也称为缩小增量排序;先分成多组,组的个数即增量的值;增量逐渐递减至1即组个数递减至1
//时间复杂度:nlogn
//增量t的取法:最初shell提出取increment=n/2向下取整,increment=increment/2向下取整,直到increment=1。
//但由于直到最后一步,在奇数位置的元素才会与偶数位置的元素进行比较,这样使用这个序列的效率会很低。
//后来Knuth提出取increment=n/3向下取整+1.还有人提出都取奇数为好,也有人提出increment互质为好。
//应用不同的序列会使希尔排序算法的性能有很大的差异。
//希尔排序思想+插入排序
void ShellSort(int k[], int n)
{
int i, j, tmp;
int step = n;
do
{
step = step / 3 + 1;
for (i = step; i < n; i++)
{
if (k[i] < k[i - step])
{
tmp = k[i];
for (j = i - step; (j >= 0 )&&(k[j] > tmp); j -= step)
{
k[j + step] = k[j];
}
k[j + step] = tmp;
}
}
} while (step > 1);
}
//希尔排序思想+冒泡排序
void ShellSort2(int k[], int n)
{
int i, j, tmp;
int step = n;
do
{
step = step / 3 + 1;
for (i = 0; i < n; i++)
{
for (j = i; j < n - step; j += step)
{
if (k[j] > k[j + step])
{
tmp = k[j];
k[j] = k[j + step];
k[j + step] = tmp;
}
}
}
} while (step > 1);
}
void print(int a[], int num)
{
int i = 0;
for (i = 0; i < num; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
int main()
{
int a[10] = { 2, 3, 56, 1, 4, 7, 8, 94, 3, 10 };
int b[10] = { 2, 3, 56, 1, 4, 7, 8, 94, 3, 10 };
print(a, 10);
print(b, 10);
ShellSort(a, 10);
print(a, 10);
ShellSort2(b, 10);
print(b, 10);
return system("pause");
}