手撕排序算法:插入排序

文章目录

  • 1.算法思想
  • 2.算法分析
    • 2.1时间复杂度
    • 2.2 空间复杂度
  • 3.算法的优缺点
    • 3.1 优点
    • 3.2缺点
  • 4.优化方案
  • 5.代码实现
  • 6.实战
    • 6.1力扣1491.去掉最低工资和最高工资后的工资平均值
    • 6.2力扣1619.删除某些元素后的数组均值
    • 6.3 力扣1984.学生分数的最小差值

插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,直到整个数组有序。

1.算法思想

第一步:从第一个元素开始,将其视为已排序部分。
第二步:取出下一个元素,与已排序部分的元素进行比较。
第三步:如果该元素小于已排序部分的最后一个元素,则将其插入到已排序部分的适当位置。
重复步骤二和三,直到整个数组都被排序。

2.算法分析

2.1时间复杂度

我们假设「比较」和「移动」的时间复杂度为O(1)的。
「插入排序」中有两个嵌套循环。
外循环正好运行一1次迭代。但内部循环运行变得越来越短:
当i=1,内层循环1次「比较」操作。
当i=2,内层循环2次「比较」操作。
当i=3,内层循环3次「比较」操作。
当i=n-2,内层循环n一2次「比较」操作。
当i=n-1,内层循环n-1次「比较」操作。
因此,总「比较」次数如下:1+2+…+(n一1)=n(n-1)/2。总的时间复杂度为:O(n^2)。

2.2 空间复杂度

由于算法在执行过程中,只有「移动」变量时候,需要事先将变量存入临时变量X,而其它没
有采用任何的额外空间,所以空间复杂度为O(1)。

3.算法的优缺点

3.1 优点

1.简单易懂,易于实现。
2.适用于小型数组或基本有序的数组。
3.稳定性好不会改变

3.2缺点

1.对于大型无序数组,效率较低。
2.不适合大规模数据排序。

4.优化方案

「插入排序」在众多排序算法中效率较低,时间复杂度为O(2)。
考虑,在进行插入操作之前,我们找位置的过程是在有序数组中找的,所以可以利用「二分查
找」来找到对应的位置。然而,执行「插入」的过程还是O(),所以优化的也只是常数时
间,最坏时间复杂度是不变的。
「改进思路」执行插入操作之前利用「二分查找」来找到需要插入的位置。

5.代码实现

void insertsort(int* nums,int numsSize) {  for (int i = 1; i < numsSize; i++) {  int key = nums[i];  // 记录当前要插入的元素  int j = i - 1;  while (j >= 0 && nums[j] > key) {  nums[j+1] = nums[j];  j--;  }  nums[j + 1] = key;  }  
}
  1. 主循环 (for 循环):
    • 从 i = 1 开始遍历数组,因为第一个元素可以视为已排序的部分。
    • key = nums[i] 表示当前要插入的元素。
  2. 插入过程 (while 循环):
    • j = i - 1 初始化为当前元素的前一个位置,即已排序部分的末尾。
    • while (j >= 0 && nums[j] > key) 循环条件是 j 大于等于 0 并且当前位置的元素大于 key
    • 在循环内部,将比 key 大的元素向右移动一个位置,为 key 腾出插入的空间。
  3. 插入操作
    • nums[j + 1] = key 将 key 插入到合适的位置,即 j + 1 处。
  4. 循环结束
    • 当内部的 while 循环条件不满足时,表示已经找到了 key 的正确位置,此时将 key 插入到 nums[j + 1] 处。

6.实战

6.1力扣1491.去掉最低工资和最高工资后的工资平均值

给你一个整数数组salary,,数组里每个数都是唯一的,其中salary[i]是第i个员工的工资。请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。

void insertsort(int* nums,int numsSize) {  for (int i = 1; i < numsSize; i++) {  int key = nums[i];  // 记录当前要插入的元素  int j = i - 1;  while (j >= 0 && nums[j] > key) {  nums[j+1] = nums[j];  j--;  }  nums[j + 1] = key;  }  
}  
double average(int* salary, int salarySize) {  insertsort(salary,salarySize);  int sum = 0;  for(int i = 1; i < salarySize - 1; i++){  sum += salary[i];  }  return (double)sum / (salarySize - 2);  
}

6.2力扣1619.删除某些元素后的数组均值

给你一个整数数组「r,请你删除最小5%的数字和最大5%的数字后,剩余数字的平均值。
与标准答案误差在105的结果都被视为正确结果。

void insertsort(int* nums,int numsSize) {  for (int i = 1; i < numsSize; i++) {  int key = nums[i];  // 记录当前要插入的元素  int j = i - 1;  while (j >= 0 && nums[j] > key) {  nums[j+1] = nums[j];  j--;  }  nums[j + 1] = key;  }  
}  
double trimMean(int* arr, int arrSize) {  insertsort(arr,arrSize);  int sum = 0;  int count = 0;  for(int i = arrSize / 20; i < arrSize - arrSize / 20; i++){  sum += arr[i];  count++;  }  return (double)sum / count;  
}

6.3 力扣1984.学生分数的最小差值

给你一个下标从0开始的整数数组nums,其中nums[i]表示第i名学生的分数。另给你一个整数k。
从数组中选出任意k名学生的分数,使这k个分数间最高分和最低分的差值达到最小化。
返回可能的最小差值。

void insertsort(int* nums,int numsSize) {  for (int i = 1; i < numsSize; i++) {  int key = nums[i];  // 记录当前要插入的元素  int j = i - 1;  while (j >= 0 && nums[j] > key) {  nums[j+1] = nums[j];  j--;  }  nums[j + 1] = key;  }  
}  
int minimumDifference(int* nums, int numsSize, int k) {  insertsort(nums,numsSize);  int ret = 10000000;  for(int i = 0; i + k - 1 < numsSize; i++){  int l = i;  int r = i + k - 1;  if(nums[r] - nums[l] < ret){  ret = nums[r] - nums[l];  }  }  return ret;  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/871865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言中的字符串函数

strstr函数 函数介绍 strstr 用于在一个字符串中查找另一个字符串的首次出现。 我们来看这个函数的参数名字&#xff1a;haysytack&#xff08;干草堆&#xff09;needle&#xff08;针&#xff09;,这个其实就是外国的一句谚语&#xff1a;在干草堆中找一根针&#xff0c;就…

抗量子密码算法:保障未来信息安全的新盾牌

随着量子计算的迅猛发展&#xff0c;传统加密算法正面临着前所未有的挑战。量子计算机利用量子比特的特殊性质&#xff0c;能在极短时间内破解目前广泛使用的公钥加密体系&#xff0c;如RSA、ECC等。这使得我国及全球的信息安全体系遭受严重威胁。为了应对这一挑战&#xff0c;…

unity宏编译版本

在写c程序的时候我们通常可以用不同的宏定义来控制不同版本的编译内容&#xff0c;最近有个需求就是根据需要编译一个完全体验版本&#xff0c;就想到了用vs的那套方法。经过研究发现unity也有类似的控制方法。 注意这里设置完后要点击右下的应用&#xff0c;我起先就没有设置…

09 函数基础

目录 一、定义一个函数 二、调用函数 三、函数的参数 1.形参和实参 2. 参数的分类 3.参数默认值 4.参数类型说明 5.不定长参数 四、函数的返回值 1.定义 2.关键字return 五、变量的作用域 六、匿名函数 七、实参高阶函数 1.定义 2.常见实参高阶函数 max、min、so…

10.1 JSP语言入门

JSP语言入门 目录一、 基础概念1. 什么是JSP&#xff1f;2. 工作原理3. 基本语法 二、 表达式语言&#xff08;EL&#xff09;1. 简介2. 语法 三、 JSTL&#xff08;JSP Standard Tag Library&#xff09;1. 简介2. 核心标签库3. 常用标签 四、 高级话题1. 会话管理2. 自定义标…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十一)-无人机服务可用性用例需求

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

Python:while循环

while循环体 while 条件: 符合条件执行语句 .... 执行完后需执行的语句 # while循环 i1 while i<5:print(i)ii1 print("Done") test. 做一颗圣诞树吧 答案&#xff1a; # while循环 i 1 j5 while i < 5:print( * j* * i)i i 2jj-1 print("Done"…

护佑未来!引领儿童安全新时代的AI大模型

引领儿童安全新时代的AI大模型 一. 前言1.1 AI在儿童安全方面的潜在作用1.2 实时监控与预警1.3 个性化安全教育与引导1.4 家长监护与安全意识提升 二. AI大模型的优势2.1. 保护儿童隐私和安全的重要性2.2. AI大模型如何应用于儿童安全领域2.1 儿童内容过滤2.2.1 儿童行为监测 2…

代码检查规则语言CodeNavi中代码语句的节点和节点属性

本文分享至华为云社区《CodeNavi 中代码语句的节点和节点属性》。作者&#xff1a;Uncle_Tom 1. 前期回顾 《寻找适合编写静态分析规则的语言》 根据代码检查中的一些痛点&#xff0c;提出了希望寻找一种适合编写静态分析规则的语言。 可以满足用户对代码检查不断增加的各种需求…

使用 PyAMF / Django 实现 Flex 类映射

1、问题背景 PyAMF 是一个用于在 Flex 和 Python 之间进行通信的库&#xff0c;在使用 PyAMF 与 Flex 应用进行通信时&#xff0c;经常会遇到错误。例如&#xff0c;在发送一个 Flex Investor 对象到 Python 时&#xff0c;会得到一个 ‘KeyError: first_name’ 的错误。这是因…

DevToys-开源免费开发工具箱

个人觉得相较于那些在线的工具箱&#xff0c;这种离线的工具箱客户端更加可信一些。 DevToys 提供了30 个默认工具&#xff1a; 转换器&#xff1a;JSON <> YAML、日期、数字基数......编码器/解码器&#xff1a;HTML、URL、Base64、GZip、JWT、二维码......格式化程序…

如何理解LTI系统的线性相位和群延迟

原文出自微信公众号【小小的电子之路】 在信号处理领域&#xff0c;经常会提到两个名词-线性相位与群延迟&#xff0c;那么&#xff0c;什么是线性相位&#xff1f;什么是群延迟&#xff1f;二者之间又有什么关系呢&#xff1f; 一、理论原理 1、线性相位 对于线性时不变系统…

[BJDCTF2020]EzPHP1

知识点&#xff1a;1. url编码绕过 2. %0a绕过 3. post优先级绕过 4. php伪协议 5. 数组的强类型比较绕过 6. 取反绕过 进入之后发现了一个很帅气的页面&#x1f60e;~ 看看网页源代码试试~ 是base32编码&#xff0c;尝试一下解码. https://www.qqxiuzi.cn/bianma/base.php 解…

SpringBoot+Vue实现简单的文件上传(Excel篇)

SpringBootVue实现简单的文件上传 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI 2 页面 3 效果&#xff1a;只能上传xls文件且大小限制为2M&#xff0c;选择文件后自动上传。 4 前端代码 <template><div class"container"><el…

Java---类与对象(二)

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 文章目录 封装访问限定符&#xff08;重点&#xff0…

基于springboot 大学校园拼够系统设计与实现

摘 要 大学校园拼购系统是为了方便用户能够在网站上查看校园拼购、公告信息等&#xff0c;于是开发了基于springboot框架设计与实现了一款简洁、轻便的大学校园拼购系统。本系统解决了大学校园拼购管理事务中的主要问题&#xff0c;包括以下多个功能模块&#xff1a;商家、用户…

Golang | Leetcode Golang题解之第229题多数元素II

题目&#xff1a; 题解&#xff1a; func majorityElement(nums []int) (ans []int) {cnt : map[int]int{}for _, v : range nums {cnt[v]}for v, c : range cnt {if c > len(nums)/3 {ans append(ans, v)}}return }

找到完美的横道图工具:2024年选择指南

国内外主流的10款项目进度横道图软件对比&#xff1a;PingCode、Worktile、灵动计划&#xff08;Wolai&#xff09;、飞书项目、Tapd、麦客CRM、Asana、Trello、Smartsheet、Basecamp。 在管理项目时&#xff0c;确保所有进度和任务都按计划进行是每个项目经理面临的一大挑战。…

WordPress:无法创建新文章?创建新帖子时候页面空白

wordPress中我们新建文章的时候&#xff0c;会遇到页面空白&#xff0c;这个问题是怎么导致呢&#xff1f;我们可以打开F12开发者模式看下报错信息&#xff0c;这是一个警告信息 Warning: Creating default object from empty value in /pub 到数据库 wp_posts中查看生成了很…

漏洞挖掘 | 记某证书站任意账号接管漏洞

下文中所述漏洞已修复 在前段时间的漏洞挖掘中&#xff0c;上了某证书站&#xff0c;打点的一处逻辑漏洞 访问某一站点&#xff0c;发现了一处登录页 点击登录按钮之后&#xff0c;发现该站点大概率是自写站点&#xff0c;存在逻辑漏洞的可能性大大增大&#xff0c;利用前期信…