数据结构实验之排序六:希尔排序

此种方法有缺陷

  1. 缺点:
    此种方法是先按照dk=n/2排序的,然后再按照1排序的此种方法是先按照dk=n/2排序的,然后再按照1排序的,如果顺序反过来,2个结果是一样的,WA
  2. 原因:数组改变了
  3. 解决方法:再设置另一个数组,保存所给的数组
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int n,a[10010],b[10010];
void shell(int dk)//dk表示增量
{
    int i,j,t;
    for(i=dk;i<=n-1;i++)
    {
        t=a[i];
        for(j=i;j>=dk&&a[j-dk]>t;j-=dk)//j>=dk???
            a[j]=a[j-dk];
        a[j]=t;
    }
    for(i=0;i<n-1;i++)
        printf("%d ",a[i]);
    printf("%d\n",a[i]);


}
int main()
{
    while(~scanf("%d",&n))
    {
        int i;
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        shell(n/2);
        shell(1);
    }

    return 0;
}

改进版

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int n,a[10010],b[10010];
void shell(int a[],int dk)//dk表示增量  //改进
{
    int i,j,t;
    for(i=dk; i<=n-1; i++)
    {
        t=a[i];
        for(j=i; j>=dk&&a[j-dk]>t; j-=dk) //j>=dk???
            a[j]=a[j-dk];
        a[j]=t;
    }
    for(i=0; i<n-1; i++)
        printf("%d ",a[i]);
    printf("%d\n",a[i]);


}
int main()
{
    while(~scanf("%d",&n))
    {
        int i;
        for(i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
            b[i]=a[i];//改进
        }
        shell(a,n/2);//改进
        shell(b,1);//改进


    }

    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值