王道第八章排序算法4-希尔排序算法C语言

#include <stdio.h>
int shsort(int a[], int n)   
{
    int d;
    for( d=n/2;d>0;d/=2){
    	for(int i=d;i<n;i++){  	
    		int temp =a[i];
    		int j =i;
    		while(a[j-d]>a[j] && j>0){
			
				a[j] = a[j-d];
				a[j-d] = temp;	
				j=j-d; //j--;一直和前面那个比,这里减去差值d,直到前面的小于后面的 
			}		
		}
	}		   
}
int main()
{
    int a[6] = {5,4,2,3,7,6};
    shsort(a, 6);   
     printf("\n");
    printf("排序后的顺序是:\n");
    for(int i=0;i<6;i++)
    printf("%5d",a[i]);   
    printf("\n");
    return 0;
}

!!!才发现以上代码为错误代码,当数据多的时候会出现乱序,注意观察j的值,上面的代码我while循环的条件为j>0,但是可能出现d较小的时候也进入循环,造成数据丢失重复,事实上只要>=d就行了

改正后的代码:

#include <stdio.h>
int shsort(int a[], int n)   
{
    int d;
    for( d=n/2;d>0;d/=2){
    	for(int i=d;i<n;i++){  	
    		int temp =a[i];
    		int j =i;
    		while(a[j-d]>a[j] && j>=d){
			
				a[j] = a[j-d];
				a[j-d] = temp;	
				j=j-d; //j--;一直和前面那个比,这里减去差值d,直到前面的小于后面的 
			}		
		}
	}		   
}
int main()
{
    int a[20] = {58,23,25,45,25,10,23,6,5,82,41,20,27,30,36,45,17,6,1,29};
    shsort(a, 20);   
    printf("排序后的顺序是:\n");
    for(int i=0;i<20;i++){
    	   printf("%5d",a[i]); 
	}

    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值