排序——直接插入排序折半插入排序

news2025/1/11 14:06:07

文章目录

  • 前言
  • 一、排序的基本概念
    • 1. 排序的定义
    • 2. 排序的分类
      • 1) 稳定排序
      • 2) 不稳定排序
  • 二、插入排序
    • 1. 直接插入排序
      • 1)直接插入排序算法分析
    • 2. 直接插入排序代码
    • 3. 直接插入排序时间复杂度
    • 4. 折半插入排序
    • 5. 折半插入排序代码
  • 总结


前言

  1. 排序的基本概念
  2. 数据结构稳定排序
  3. 数据结构不稳定排序
  4. 排序的种类
  5. 排序的代码
  6. 直接插入排序算法

一、排序的基本概念

1. 排序的定义

  1. 定义:将数据表调整为按关键字从小到大或从大到小的次序排列的过程
  2. 排序的分类:增排序,减排序,内部排序,外部排序
  3. 稳定排序:在排序过程中,如果关键字相同的两个元素的相对次序不变,则称为稳定的排序
  4. 不稳定的排序:当相同的关键字的领先关系在排序过程中不发生变化者,则称所用的排序方法是不稳定的
  5. 算法的稳定性:排序中两个元素相等,排序后位置不发生变化说明算法稳定,主要是对算法性质的描述,不能衡量算法优劣
  6. 内部算法通常进行:比较+移动,基数排序不是基于比较的

2. 排序的分类

1) 稳定排序

插入排序、冒泡排序、归并排序、基数排序


2) 不稳定排序

选择排序、快速排序、希尔排序、堆排序


二、插入排序

基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中,直到全部记录插入完成,每次插入便又多一个元素排好相对顺序

1. 直接插入排序

在这里插入图片描述

1)直接插入排序算法分析

基本思想:
将待排序表看做是左、右两个部分,其中左边为有序区,右边为无序区,整个排序过程就是将右边无序区中的元素逐个插入到左边的有序区中,以构成新的有序区。

  1. 将第i个元素插入到前面已经排序好的i-1的元素中,步骤为:
    (1)查找出L(i)在L[1…i-1]中位置k
    (2)将L[k…i-1]中所有元素全部后移一位
    (3)将L(i)复制到L(k)

  2. 稳定性:每次插入元素总是从后往前比较后再移动,所以算法稳定

  3. 适用性:适用于顺序存储和链式存储

  4. 性质
    (1)在基本有序情况下,效率最高,不需移动元素
    (2)排序了i以后可以确定有i个元素连续,而不一定有元素已在最后的位置上

2. 直接插入排序代码

void   InsertSort(elementtype r[n+1])
{
  for (  i=2 ;  i<=n ; ++ i ) 
    {
      r[0]=r[i]; // 将待插入记录复制为哨兵
      j=i-1;
      while(r[j]>r[0]) 
      {r[j+1]=r[j];
         j--;
        }
     r[ j+1]=r[0];      //插入到正确位置
    }
 }

#include <stdio.h>
void main()
{ 
int a[7]={3,2,1,5,0,-1,7};
   int x,i,j;
  for(i=1;i<=6;i++)
   {
x=a[i];
    j=i-1;
while(x<a[j]&&j>=0)
{a[j+1]=a[j]; j- -;}  
       a[j+1]=x;       
}

3. 直接插入排序时间复杂度

从时间耗费角度来看,主要时间耗费在关键字比较和移动元素上。
直接插入排序的时间复杂度:

  1. 最好情况:初始有序,为O(n);
  2. 最坏情况:初始逆序,为O(n2);
  3. 平均时间复杂度T(n)= O(n2)
  4. 直接插入排序方法是稳定的排序方法。
  5. 直接插入排序算法简便,比较适用于待排序记录数目较少且基本有序的情况。当待排记录数目较大时,直接插入排序的性能就不好

4. 折半插入排序

  1. 定义:也叫二分插入排序,先折半查找出元素的待插入位置,然后再统一移动待插入位置之后的所有元素

5. 折半插入排序代码

void InsertSort(ElemType A[],int n){
	int i,j,low,high,mid;
	for(i=0;i<n;i++){
	A[0]=A[i];
	low=1;
	high=i-1;
	while(low<=high){
		mid=(low+high)/2;
		if(A[mid].key>A[0].key)
			high=mid-1;
		else
			low=mid+1;
	}
	for(j=i-1;j>=high+1;--j)
		A[j+1]=A[j];
	A[high+1]=A[0]}
}
  1. 效率:减少了元素比较的次数,约为O(nlog2n),该比较次数与待排序初始状态无关,仅取决于n;移动次数没有改变,依赖于待排序初始状态,时间复杂度为 O(n2)

  2. 稳定性:算法稳定
    排序思想:
    在找第i个记录的插入位置时,前i-l个记录已排序,将第i个记录的排序码 keyi和已排序的前i-1个的中间位置记录的排序码进行比较,如果keyi小于中间位置记录排序码,则可以在前半部继续使用二分法查找,否则在后半部继续使用二分法查找,直到查找范围为空,即可确定ri的插入位置。


总结

  1. 排序的基本概念
  2. 数据结构稳定排序
  3. 数据结构不稳定排序
  4. 排序的种类
  5. 排序的代码
  6. 直接插入排序算法
  7. 折半插入排序算法

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

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

相关文章

从数字化到智能化再到智慧化,智慧公厕让城市基础配套更“聪明”

随着科技的迅猛发展&#xff0c;城市生活方式与配置设施的方方面&#xff0c;面也在不断的改变和升级。智慧公厕作为城市基础配套设施的一部分&#xff0c;从数字化到智能化再到智慧化&#xff0c;正逐渐展现出其独特的魅力和优势。实现了公共厕所建设、使用与管理方式的全面变…

【AI】机器学习——支持向量机(非线性及分析)

5. 支持向量机(线性SVM) 文章目录 5.4 非线性可分SVM5.4.1 非线性可分问题处理思路核技巧核函数特点 核函数作用于SVM 5.4.2 正定核函数由 K ( x , z ) K(x,z) K(x,z) 构造 H \mathcal{H} H 空间步骤 常用核函数 5.5 SVM参数求解算法5.6 SVM与线性模型关系 5.4 非线性可分SVM …

奇偶数之和

任务描述 本关任务&#xff1a;请编一个函数fun(int *a,int n,int *odd,int *even)&#xff0c;函数的功能是分别求出数组a中所有奇数之和以及所有偶数之和。形参n给出数组中数据的个数&#xff1b;利用指针odd返回奇数之和&#xff0c;利用指针even返回偶数之和。 例如&#…

UE5_OpenCV库的加载方式

UE5使用opencv库要在系统中添加opencv的环境变量 在项目文件夹下新建ThirdParty,将OpenCV中的bin、opencv文件夹copy到ThirdParty中 打开项目,找到source目录下的build.cs文件 修改build.cs内容,添加头文件路径,dll路径,lib路径 // Copyright Epic Games, Inc. All Right…

leetcode21

题目&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输…

腾讯mini项目-【指标监控服务重构】2023-07-21

今日已办 当在Docker容器中运行程序时&#xff0c;可能会遇到使用os.Getpid()函数时出现异常的情况。这是因为Docker容器中的进程隔离机制与宿主机器不同&#xff0c;容器内部的进程可能无法访问宿主机器的进程信息。 要解决这个问题&#xff0c;可以尝试&#xff1a; 使用do…

Linux磁盘管理:最佳实践

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

每日一博 - 防范彩虹表攻击_数据库存储密码的秘密武器

文章目录 概述图解小结 概述 加盐&#xff08;salting&#xff09;是一种安全存储数据库中密码并验证其真实性的常见方法&#xff0c;它的主要目的是增加密码的安全性&#xff0c;以防止常见的密码攻击&#xff0c;如彩虹表攻击。以下是关于如何使用加盐技术的简要介绍&#x…

计算机二级python基础题刷题笔记(三)

hello&#xff0c;看到三的小伙伴们你们已经超过30%的对手啦&#xff01;接下来也要加油呀 代码没有最好&#xff0c;只有更好&#xff0c;如果你有更好的想法答案欢迎在评论区里发表呀 1、将程序里定义好的std列表里的姓名和成绩与已经定义好的模板拼成一段话&#xff0c;显示…

我的微信公众号开通啦,来关注我吧

我的微信公众号开通啦&#xff0c;承蒙各位粉丝的厚爱&#xff0c;请大家动动手指扫码关注吧 公众号主要以Android开发技术文章为主&#xff0c;活跃度高&#xff0c;紧跟技术前沿&#xff0c;内容深度而全面&#xff0c;重要的是 私信必回&#xff01;私信必回&#xff01;私…

利用github托管个人网站

如何制作个人学术主页&#xff1f; - 知乎去年年底刚刚基于开源项目al-folio重新做了自己的个人主页。注意&#xff0c;这个开源项目很好&#xff0c;但是有个尴尬的问题…https://www.zhihu.com/question/281476526/answer/2360738062 your site可能会出现的慢一点&#xff0…

qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.qsort函数 1.1qsort函数的参数 …

Java笔记:Arthas-Java线上异常排查

一、安装 arthas在github上有个page&#xff0c;地址是https://alibaba.github.io/arthas/。 安装的方式有好几种&#xff1a; 1.直接下载一个可以启动的jar包然后用java -jar的方式启动 2.用官方提供的as.sh脚本一键安装 3.用rpm的方式安装 本篇介绍第一种方式&#xff0c;因…

无涯教程-JavaScript - EXP函数

描述 EXP函数返回e升至数字的幂。常数e等于自然对数的底数2.71828182845904。 语法 EXP (number)争论 Argument描述Required/OptionalNumberThe exponent applied to the base e.Required Notes 要计算其他碱基的幂,请使用幂运算符(^) EXP是LN的倒数,LN是数字的自然对数…

基于SSM的汽车租赁后台管理系统

基于SSM的汽车租赁后台管理系统 介绍 包括登录、首页、客户管理、车辆管理、汽车出租、出租单管理、汽车入库、检查单管理、系统管理等功能&#xff0c;适合二次开发课程设计、毕业设计等 软件架构 SSM 运行环境 数据库 mysql 安装教程输入链接说明 端口&#xff1a;3306…

第16篇ESP32 platformio_arduino框架 wifi联网_连接WiFi热点并连接tcp server收发数据进行通讯

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…

BeanFactory版本的快速入门

目录 IOC原理 IOC工作步骤 开发步骤 实现代码 DI原理 DI工作步骤 IOC原理 在Spring框架中&#xff0c;IOC是通过Bean容器&#xff08;例如ApplicationContext&#xff09;来实现的。Bean容器负责管理Bean的创建、依赖关系的注入和对象的生命周期的控制。通过配置文件&am…

【软件设计师-从小白到大牛】上午题基础篇:第一章 计算机组成与体系结构

文章目录 前言章节提要一、数据的表示&#xff08;进制的转换&#xff09;1、R进制转十进制使用按权展开法2、十进制转R进制使用短除法(余数从下往上排列&#xff09;3、二进制转八进制与十六进制 二、数据的表示&#xff08;原码反码补码移码&#xff09;真题链接 三、数据的表…

国内券商有没有量化交易接口,哪家做的比较好

个人账户实现股票量化程序化自动交易&#xff0c;券商有接口&#xff0c;门槛已降低_股票程序交易接口的博客-CSDN博客 凡是开了量化交易接口的券商做的都不错&#xff0c;关键看适不适合你自己 我在用的是python语言&#xff0c;有本地客户端&#xff0c;随时修改随时调整策略…

基于Java的考编论坛网站的设计与实现(亮点:在线发布帖子、内容评论回复、购买二手物品、在线支付)

考编论坛网站 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实现5.1 前端界面…