考研算法28天:优化版插入排序(折半插入排序)【二分,插入排序】

news/2024/11/30 10:30:31/

算法介绍

算法介绍就是说我们原先写的插入排序的这段代码

for(int i=1;i<n;i++){//开始向前遍历,如果发现前面的元素比//x大的话,就将前面的元素放到x的后面int x = q[i],j=i;while( j && q[j-1]>x ){q[j] = q[j-1];j--;}q[j] = x;}

我们里面那层循环最坏的情况是比较N次,但是其实我们是可以通过二分来优化这一步骤的。但是我们也要明白二分只能优化比较次数,但是没办法优化换的次数。就是说因为原先已经进入新数组的排序顺序是已经有序的了,我们可以通过二分快速查找到我们需要插入的数的目标位置。

如下图

 注:y总的定义的区间都是左开右闭的

上面那里的代码也就替换成了下面这个

//i为啥从1开始?因为下标为0的数字没有位于其前需要比较的数for(int i=1;i<n;i++){//如果发现此时遍历的数本身就比前面最大的数大就不需要重排了if(q[i]>q[i-1]) continue;int x = q[i];//开始二分int left = 0, right = i-1;while(left<right){int mid = (left + right) >>1;//区间都是左开右闭的if(q[mid]>x) right = mid;else left = mid + 1;}//比x大的数全部往后移动一位for(int j = i-1;j>=right;j--){q[j+1] = q[j];}q[right] = x;}

算法题目

完整代码

#include <iostream>using namespace std;const int N = 1000010;
int q[N];
//区间都是左开右闭的
void discount_insert_sort(int n){//i为啥从1开始?因为下标为0的数字没有位于其前需要比较的数for(int i=1;i<n;i++){//如果发现此时遍历的数本身就比前面最大的数大就不需要重排了if(q[i]>q[i-1]) continue;int x = q[i];//开始二分int left = 0, right = i-1;while(left<right){int mid = (left + right) >>1;//区间都是左开右闭的if(q[mid]>x) right = mid;else left = mid + 1;}//比x大的数全部往后移动一位for(int j = i-1;j>=right;j--){q[j+1] = q[j];}q[right] = x;}return;
}
int main(){int n;cin>>n;for(int i=0;i<n;i++)scanf("%d",&q[i]);discount_insert_sort(n);for(int i=0;i<n;i++)printf("%d ",q[i]);return 0;
}

http://www.ppmy.cn/news/481352.html

相关文章

Django-带参数的路由编写(二)【用正则表达式匹配复杂路由】

在上一篇博文中&#xff0c;学习了“不用正则表达式匹配的简单带参数路由”&#xff0c;详情见链接&#xff1a; https://blog.csdn.net/wenhao_ir/article/details/131225388 本篇博文学习用“用正则表达式匹配复杂路由”。 简单的参数路由用库django.urls中的函数path()就可…

前端Vue自定义简单实用中国省市区三级联动选择器

前端Vue自定义简单实用中国省市区三级联动选择器&#xff0c; 请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13118 效果图如下&#xff1a; #### 使用方法 使用方法 <!-- themeColor:主题颜色 ref:设置唯一ref pickerValueDefault:默认选择…

每日算法(第二十六期)

先来回顾一下上期的问题及答案&#xff1a; 「删除链表的倒数第 N 个节点」&#xff08;Remove Nth Node From End of List&#xff09;。 题目描述&#xff1a; 给定一个链表&#xff0c;删除链表的倒数第 n 个节点&#xff0c;并返回链表的头节点。 示例&#xff1a; 给定一个…

行业报告 | 生成式人工智能:人人可用的新时代

原创 | 文 BFT机器人 01 人工智能的发展迎来新拐点 ChatGPT 正在唤醒全球对人工智能 (AI)变革潜力的认知&#xff0c;激发起前所未有的关注和创造力浪潮。 该技术可以模仿人类的对话和决策能力&#xff0c;使我们站上了公众采用人工智能的第一个真正拐点。最终&#xff0c;所有…

WPS数据清洗+R语言读取文件画频数分布直方图

R语言是一门好语言&#xff0c;但很多人在读取文件中数据时会遇到问题。比如我遇到的问题就是从文件中读取数据后&#xff0c;数据无法用于画图。 检索了N篇博文&#xff08;抱歉我实在无法一一列举30篇博文&#xff09;后&#xff0c;终于看到曙光&#xff0c;事实告诉我学任…

直击面试现场:你对MySQL的数据类型了解有多少?

前言 隔着玻璃门&#xff0c;看着面试官缓缓走来&#xff0c;头上飘着几根白发&#xff0c;在行走中随风摇曳&#xff0c;看的让人有一种想帮他薅下来的冲动。 这次面试的岗位是数据库数据类型&#xff0c;面试官坐下来冲着面试者沐风晓月呵呵一笑&#xff0c; “来啦”&…

[转]Android TV 遥控器适配

文章目录 一、常用命令介绍二、红外遥控器适配 2.1 海思红外遥控器适配2.2 Amlogic红外遥控器适配2.3 Mstar红外遥控器适配三、蓝牙遥控器适配 3.1 蓝牙键值3.2 kl3.3 Android键值 一、常用命令介绍 在目前的机顶盒市场中&#xff0c;海思和Amlogic&#xff08;之前还有Mstar&a…

基于STC15W408AS单片机的陀螺仪显示器设计

提示&#xff1a;本文属于技术的交流&#xff0c;如有抄袭请联系删除。 文章目录 前言一、STC15W408AS单片机二、总体设计1.硬件设计(1)原理图设计a.MCU设计b.传感器接口设计c.液晶显示d.电源e.总体图样 (2)PCB设计a.2D绘制展示&#xff08;顶层和底层&#xff09;b.3D绘制展示…