《数据结构》二分插入排序算法

二分插入排序(Binary Insertion Sort)

过程图示:

1.a[0]--a[3]已经是有序表

2.leftright 用来确定目标插入位置。left 是最小的可能插入位置,right 是最大的可能插入位置。通过不断调整这两个边界,最终可以找到合适的插入位置。

   mid=(left+right)/2

 

3. 7>5(a[mid]),left=mid+1,mid=(left+right)/2

 

 

 

4. 7<10(a[mid]),right=mid-1

 

  

5. right<left,将待插入元素插入left位置

 

在代码中我们认为第一个元素为有序列表,从第二个元素开始遍历。 

简易代码描述:

void Binsert_sort(int a[], int n)
{
	int i, j, left, right, mid, x;
	for (i = 1; i < n; i++)
	{
		x = a[i];
		left = 0;
		right = i - 1;
		
		// 使用二分查找确定插入位置
		while (left <= right)
		{
			mid = (left + right) / 2;
			if (x < a[mid])
			{
				right = mid - 1;
			}
			else
			{
				left = mid + 1;
			}
		}
		
		// 右移动元素以为新元素腾出位置
		for (j = i - 1; j >= left; j--)
		{
			a[j + 1] = a[j];
		}
		
		// 将新元素插入到正确的位置
		a[left] = x;
	}
}

代码分析:

  1. 二分查找部分

    • 这部分代码通过二分查找确定了插入位置 left
    • 当 x < a[mid] 时,将右边界 right 移到 mid - 1,否则将左边界 left 移到 mid + 1
  2. 移动元素

    • 在找到插入位置后,需要将从 left 到 i-1 的所有元素右移,以为新元素 x 腾出位置。
  3. 插入元素

    • 在完成元素的移动后,将 x 插入到正确的位置 a[left]
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

data_structure_wr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值