【21天学习挑战赛—经典算法】折半插入排序


活动地址:CSDN21天学习挑战赛

*学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。

最近学习很闹,之后的算法理解学习概念,把掌握的前面的巩固

学习专栏地址

经典算法_一头小山猪的博客-CSDN博客

文章

一文学懂经典算法系列之:折半插入排序(附讲解视频)

思路

  • 将待排序的序列的第一个元素看做一个有序序列,
  • 把第二个元素到最后一个元素当成是未排序序列。
  • 从头到尾依次扫描未排序的序列,将扫描到的每个元素插入有序序列的适当位置。
  • 折半插入排序根据二分查找法在有序序列中查找合适的位置将还未排序的元素插入。
  • (在这里需要注意一个问题,如果在有序序列中有一个和待插入的元素相等,则将待插入的元素查到此元素的后面,这样方式的插入排序是稳定的。

js 实现

let arr = [];
let low,high,m,temp;
for (let i = 1; i < len; i++){		
//先通过二分查找在有序序列中找到无序元素合适的插入位置,在通过数组元素后移,将无序元素插入其中		
low = 0;		
high = i - 1;		
temp = arr[i];		
//最后退出while循环的时候,low>high		
//high指向待插入位置的前一位,而low指向待插入位置		
while (low <= high){			
	//找到有序序列中间位置			
	m = (low + high) / 2;			
	//将无序元素和中间元素值进行比较,看该元素是比中间元素大,还是比中间元素小			
	if (arr[i] >=arr[m]) { low = m + 1; }			
	else { high = m - 1; }
}		
//找到合适位置,此时进行有序序列元素后移,腾出空间存放无序元素
for (let j = i - 1; j > high; j--)	{
	arr[j + 1] = arr[j];
}
arr[j + 1] =temp;	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值