#include <stdio.h>
typedef int ElementType; //自定义类型
void ShellSort(ElementType A[],int N); //希尔排序
void ShellSort_N(ElementType A[], int N) ;
int main(void)
{
int i;
int b[20] = {12,4,56,8,49,6,37,5,56,99,66,48,2,1,6,9,4,5,3};
ShellSort_N(b,20);
for( i = 0; i < 20; i++)
printf("%-4d",b[i]);
printf("\nHello World!\n");
return 0;
}
void ShellSort(ElementType A[], int N) //希尔排序 增量序列为 ht = [ N / 2]
{ //流行的增量序列,但是并不是非常好
int i,j,Increment;
ElementType Tmp;
for(Increment = N / 2; Increment > 0; Increment /= 2)
{
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;
}
}
}
void ShellSort_N(ElementType A[], int N) //希尔排序 增量序列为 ht = [ 2^K - 1]
{ //这是Hibbard提出的增量序列,它在实践中和理论中给出较好结果
int i,j,Increment,Increment_N;
ElementType Tmp;
for( i = 1; i < N; i++) //确定最大的k
{
if( 1 << i <= N)
Increment_N = i;
else
break;
}
// printf("Incrememt_N = %d\n",Increment_N);
//增量从 2^k - 1 开始
for(Increment = (1<<Increment_N) - 1 ; Increment_N >= 0;Increment = (1<<Increment_N) - 1 )
{
// printf("\nIncrement = %d,Increment_N = %d\n",Increment,Increment_N);
for( i = Increment ; i < N; i++) //从第Increment个开始
{
Tmp = A[i];
for(j = i; j >= Increment; j -= Increment)
{
if(Tmp < A[j - Increment]) //每个与它前面第Increment个比较
A[j] = A[j - Increment];
else
break;
}
A[j] = Tmp; //找到正确是位置,并放好了,
}
Increment_N--;
}
}
typedef int ElementType; //自定义类型
void ShellSort(ElementType A[],int N); //希尔排序
void ShellSort_N(ElementType A[], int N) ;
int main(void)
{
int i;
int b[20] = {12,4,56,8,49,6,37,5,56,99,66,48,2,1,6,9,4,5,3};
ShellSort_N(b,20);
for( i = 0; i < 20; i++)
printf("%-4d",b[i]);
printf("\nHello World!\n");
return 0;
}
void ShellSort(ElementType A[], int N) //希尔排序 增量序列为 ht = [ N / 2]
{ //流行的增量序列,但是并不是非常好
int i,j,Increment;
ElementType Tmp;
for(Increment = N / 2; Increment > 0; Increment /= 2)
{
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;
}
}
}
void ShellSort_N(ElementType A[], int N) //希尔排序 增量序列为 ht = [ 2^K - 1]
{ //这是Hibbard提出的增量序列,它在实践中和理论中给出较好结果
int i,j,Increment,Increment_N;
ElementType Tmp;
for( i = 1; i < N; i++) //确定最大的k
{
if( 1 << i <= N)
Increment_N = i;
else
break;
}
// printf("Incrememt_N = %d\n",Increment_N);
//增量从 2^k - 1 开始
for(Increment = (1<<Increment_N) - 1 ; Increment_N >= 0;Increment = (1<<Increment_N) - 1 )
{
// printf("\nIncrement = %d,Increment_N = %d\n",Increment,Increment_N);
for( i = Increment ; i < N; i++) //从第Increment个开始
{
Tmp = A[i];
for(j = i; j >= Increment; j -= Increment)
{
if(Tmp < A[j - Increment]) //每个与它前面第Increment个比较
A[j] = A[j - Increment];
else
break;
}
A[j] = Tmp; //找到正确是位置,并放好了,
}
Increment_N--;
}
}