希尔排序实现(不太满意)

我的理解是, 插入排序最适合两种场景: 1). 较为有序情况; 2). 元素较少的情况. 所以, 希尔排序的思路就是:
1. 先把原始集合分割为一个个较小的集合, 进行插入排序, 符合场景 2)
2. 再将 1 处理后的集合切割为更小的集合, 继续进行插入排序, 仍符合场景2)
3. 当每一子集合的元素个数都为 1 时, 对整体进行插入排序, 此时符合场景1)

template
   
   
    
    
void ShellSort (Container &container)
{
	const int container_len = container.size ();
	int sub_container_len = 1;
	//设置合适的sub_container_len
	while (sub_container_len < container_len / 3) 
		sub_container_len = sub_container_len * 3 + 1;
	//不断缩小sub_container_len, 直到其为0
	while (sub_container_len > 0){
		//对间隔为sub_contianer_len 的元素进行插入排序
		for (int i = sub_container_len; i < container_len; ++i)
			for (int j = i;
				 ( j >= sub_container_len) && (container[ j ] < container[ j - sub_container_len ]);
				 j -= sub_container_len)
				 swap (container[j], container[j - sub_container_len]);
		sub_container_len = sub_container_len / 3;
	}
}

   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值