当前位置: 首页 > news >正文

2、稳定排序二——插入排序

2、插入排序
  • 通过插入和比较 来排序:

    • 插入时 首先和前面序列的最后一个元素比较,如果要插入的元素更大,则该元素放在序列的最后;反之,则向前遍历,直到找到比要插入的元素小的元素,然后插入这个元素的后面即可。
    • 注意,由于插入排序是原地排序,所以当小于末尾元素时 需要移动元素,层层覆盖
  • 稳定性:如果要插入的元素和当前遍历的元素相等,也插入到该元素的后面。因为原序列前面的元素先插,后面的元素后插,所以相等的元素顺序不变,故稳定

  • 时间复杂度 on^2 ,空间 o1,稳定排序,原地排序

  • 代码:

  void print(vector<int>& a, int n, int i) {
  	cout << "step"<< i << ": ";
  	for (int j = 0; j < n; j++) {
  		cout << a[j] << " ";
  	}
  	cout << endl;
  }
  
  void insertionSort(vector<int>& a, int n) {//{ 9,1,5,6,2,3 }
  	for (int i = 1; i < n; ++i) // 从第二个元素开始遍历
      {
          j = i - 1;// j指向前一个元素
          int x = a[i];
  		if (x < a[j]) // 比较它和前面序列的最后一个元素,如果是>,什么都不用做了;如果是<,说明要移动元素了
          {   
              a[i] = a[j];//移到i的位置
              j--;// j指向倒数第二个元素
              
  			while (j >= 0 && x < a[j]) // 只要 x < a[j]了,说明就要移动元素了
              {   
  				a[j + 1] = a[j];// 把a[j]往后移一格
  				j--; //指向前一个元素    
  			}
              //若x>a[j]了,则x放在它后面。放心,原先在这个位置的元素已经往后移一格了
  			a[j + 1] = x;     
  		}
  
  		print(a, n, i);      //打印每趟排序的结果
  	}
  }

相关文章:

  • 注册中心之Nacos相较Eureka的提升分析
  • JavaScript中的宏任务和微任务
  • Spring框架漏洞攻略
  • MyBatis-Flex、MyBatis-Plus 与 Fluent-Mybatis 的比较分析
  • FastStoneCapture下载安装教程(附安装包)专业截图工具
  • 环境评价分析中土地利用现状图的制作方法
  • 基于TweenMax和SVG的炫酷弹性进度条动画特效
  • [实操]MySQL8 读写分离后,配合redis的方法与步骤
  • 水星(MERCURY)监控初始化的恢复和转码方法
  • 【C语言】多进程/多线程
  • DeepSeek-R1 现已作为全托管无服务器模型在 Amazon Bedrock上线。
  • 反向 SSH 隧道技术实现内网穿透
  • 数据库误更新操作 如何回滚
  • VMware安装ubuntu22.04.5 server
  • Java并发编程面试汇总
  • Python学习第二十三天
  • 全面了解 Cookies、Session 和 Token
  • 【Java语言】学习笔记-08面向对象【中级】包、访问修饰符、封装、继承、多态、Super、Override(重写)、Object、断点调试等细节详解(上)
  • 6.1、认证技术基础与原理
  • [unity 点击事件] 区域响应点击事件,排除子节点区域,Raycast Target 应用
  • “五一”假期首日:国铁南宁局发送旅客81.7万人次
  • AI把野史当信史?警惕公共认知的滑坡
  • 澎湃读报丨央媒头版头条集中刊发:大国应有的样子
  • 北京亦庄启动青年人才创新创业生态示范区
  • 秦洪看盘|资金切换主线,重构市场风格
  • 中方拟解除对5名欧洲议会议员制裁?外交部:望中欧立法机构相向而行