排序法学习1-直插排序-希尔排序

1  排序思想

①   先取一个正整数d1(d1<n)作为第一个增量,将全部n个记录分成d1组,把所有相隔d1的记录放在一组中,即对于每个k(k=1, 2,  … d1),R[k], R[d1+k], R[2d1+k] , …分在同一组中,在各组内进行直接插入排序。这样一次分组和排序过程称为一趟希尔排序;

②   取新的增量d2<d1,重复①的分组和排序操作;直至所取的增量di=1为止,即所有记录放进一个组中排序为止。

#include <stdio.h>
int gnum=0;
void shellsort(int arry[],int n);
void print(int *iarry,int n,int i){
		
		for ( int j=0;j<n;j++)
		{
			printf("%d ",iarry[j]);	
		}
		printf("\n");
}




void shellinsertsort(int arry[],int n,int dk){
	for ( int inum = dk;inum < n ;inum ++ ){
		if ( arry[inum] < arry[inum - dk] )
		{
			int j = inum-dk;
			int x = arry[inum];
			
			while ( x < arry[j] )	
			{
				arry[j+dk] = arry[j];
				j -= dk;	
				if ( j < 0 )
					break;
					gnum++;
					
			}
			arry[j+dk] = x;
		}
		print(arry,10,10);
	}
}
void shellsort(int arry[],int n){
		int dk = n/2;
		while(dk >=1){
		
		printf("%d \n",dk);
		shellinsertsort(arry,n,dk);
		dk = dk/2;
	}
}

int main(){

	int iarry[10]={8,1,4,9,5,3,6,7,2,0};
	shellsort(iarry,10);
	print(iarry,10,10);
	printf("  gnum : %d\n",gnum);
	return 0;
}

对比上篇的直接插入排序:计算其循环次数

次数统计有误,请勿当真!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值