希尔排序及其基本操作

#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--;

    }
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值