其实希尔排序和插入排序好像好像!
先搬过来之前写的插入排序的程序:
void InsertionSort(int A[], int N)
{
int i = 0;
int j = 0;
int tmp;
for (i=1; i<N; i++)
{
tmp = A[i];
for (j=i; j>0 && A[j-1]>tmp; j--)
{
A[j] = A[j-1];
}
A[j] = tmp;
}
}
虽然有点啰嗦,但是可以把上面的插入排序写成这样:
void InsertionSort2(int A[], int N)
{
int i = 0;
int j = 0;
int tmp;
for (i=1; i<N; i++)
{
tmp = A[i];
for (j=i; j>=1; j-=1)
{
if (tmp < A[j-1])
A[j] = A[j-1];
else
break;
}
A[j] = tmp;
}
}
void InsertionSortShell(int A[], int N)
{
int i = 0;
int j = 0;
int tmp;
int increment = 1;
for (i=increment; i<N; i++)
{
tmp = A[i];
for (j=i; j>=increment; j-=increment)
{
if (tmp < A[j-increment])
A[j] = A[j-increment];
else
break;
}
A[j] = tmp;
}
}
写一个increment倍减的最外层循环:
void ShellSort(int A[], unsigned int N)
{
int increment = N / 2;
int temp = 0;
int i = 0;
int j = 0;
while (increment)
{
for (i=increment; i<N; i++)
{
temp = A[i];
for (j=i; j>=increment; j-=increment)
if (temp < A[j-increment])
{
A[j] = A[j-increment];
}
else
{
break;
}
A[j] = temp;
}
increment/=2;
}
}
看见了吧,这就是希尔排序的程序啦!