折半插入排序

核心代码

// An highlighted block
var foo = 'bar';
```void BlnsertSort(SqList& L) {
	for (i = 2; i <= L.length; ++i) {//依次插入第2~第n个元素
		L.r[0] = L.r[i]; l // 当前插入元素存到“哨兵”位置
			low = 1; high = i - 1; l // 采用二分查找法查找插入位置
			while (low <= high) {
				mid = (low + high) / 2;
				if (L.r[0].key < L.r[mid].key) high = mid - 1;
				else low = mid + 1;
			}//循环结束,high+1则为插入位置
		for (j = i - 1; j >= high + 1; --j) L.r[j + 1] = L.r[j];//移动元素
		L.r[high + 1] = L.r[0];
	}
}//BinsertSort

流程演示

此处假设 A=1 B=4 C=3 D=2 => ADCB为结果
在这里插入图片描述

从i=2开始, 故把B存进哨兵,low指向A high指向2-1=1还是A 符合while的循环
在这里插入图片描述

循环里定出mid =1 指向A 让带入哨兵的B与A作比较 low指向mid+1=1 不再能进行循环了(low《=high ) 而这一点也是每一次比较的“必经之路”
在这里插入图片描述

在之后的for循环不进行,直接把哨兵的值赋给L.r[high+1] 其实就是b不变
至此 ab是有序的 继续往下进行
第二次循环
在这里插入图片描述

哨兵与A作比较 3>1 故low后移一位 此时low和high都在B处
在这里插入图片描述

Mid更新 2+2/2=2 也指向b
哨兵与mid即B作比较 这次干不过了 high前移 此时low在high后面循环结束
在这里插入图片描述

开始for循环 b往右移动一位 占住 c的位置 for循环结束
哨兵将本来r2位置的b坑占住,其实就是bc换位置
在这里插入图片描述

开始第三次大循环 哨兵附着于D=2 low-》1即A=1 high附着于3即B=4 mid指向2即C=3
在这里插入图片描述

开始while循环 哨兵与c作比较 2<3 哨兵小 high指针前移
在这里插入图片描述

进一步while循环 mid=(1+1)/2=1 mid指向A 哨兵=2>A=1 low右移
在这里插入图片描述
在这里插入图片描述

While循环结束,开始for循环 其实就是因为d大小介于AC之间,CB统一向右移动 这也是for循环的意义所在
For循环结束后 哨兵或者是D占住BC右移剩下的空位 即第二位
在这里插入图片描述

结束,遍历完成

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值