C++数据结构X篇_21_插入排序(稳定的排序)

news2024/12/25 14:02:01

文章目录

  • 1. 插入排序原理
  • 2. 算法图解
  • 3. 核心代码:
  • 4. 插入排序整体代码实现

1. 插入排序原理

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

  1. 原理是将无序序列插入到有序序列中
  2. 直接插入排序的两种性质:
  • 当待排序的原序列中大多数元素都已有序的情况下,此时进行的元素比较和移动的次数较少;

  • 当原序列的长度很小时,即便它的所有元素都是无序的,此时进行的元素比较和移动的次数还是很少。

后篇介绍的希尔排序就是基于上面2个性质的改进

2. 算法图解

将待排序的集合看做两部分,已排序的区间(0…i) ; 待排序的区间[i…n);每次选择无序区间的第一个元素插入到有序区间的合适位置,直到整个数组有序。

因为不知道数组中得前几个元素是已经有序的,所以直接从第二个元素开始执行插入排序,将每个元素都进行一次插入排序。

算法图解如下:
在这里插入图片描述

3. 核心代码:

void insert_sort(int arr[], int length)  //升序
{
	int j;
	//第一个元素当做有序的,第二个看做无序,从第二个插入第一个元素并进行比较
	for (int i = 1; i < length; i++)
	{
		if (arr[i] < arr[i - 1])  //比升序序列最大值要小,进入插入排序
		{
			int temp = arr[i];
			//从右向左
			for (j = i - 1; j >= 0; j--)
			{
				if (temp < arr[j]) //升序序列中元素大于arr[i]
				{
					arr[j + 1] = arr[j]; //向前移动一位
				}
				else
				{
					break;
				}
			}
			arr[j + 1] = temp;
		}
	}
}

4. 插入排序整体代码实现

#include <iostream>
using namespace std;

void swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

//打印数组
void printArr(int arr[])
{
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << endl;
	}
}

//插入排序
void insert_sort(int arr[], int length)  //升序
{
	int j;
	for (int i = 1; i < length; i++)
	{
		if (arr[i] < arr[i - 1])  //比升序序列最大值要小
		{
			int temp = arr[i];
			for (j = i - 1; j >= 0; j--)
			{
				if (temp < arr[j]) //升序序列中元素大于arr[i]
				{
					arr[j + 1] = arr[j]; //向前移动一位
				}
				else
				{
					break;
				}
			}
			arr[j + 1] = temp;
		}
	}

	printArr(arr);
}

int main()
{
	int arr[] = { 8,2,3,9,6,4,7,1,5,10 };
	insert_sort(arr, 10);
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述

  1. 插入排序,插入排序代码实现,插入排序代码思路梳理

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

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

相关文章

Unity 自定义小地图

最近工作做了个小地图&#xff0c;再此记录下思路。 1、准备所需素材 显示为地图&#xff08;我们取顶视图&#xff09;。创建一个Cube&#xff0c;缩放到可以把实际地图包住。实际地图的尺寸和偏移量 。我这里长宽都是25&#xff0c;偏移量&#xff08;1&#xff0c;0&…

MySQL进阶(数据库引擎)——MyISAM和InnoDB引擎的区别

1.是否支持行级锁 MyISAM 只有表级锁&#xff0c;而InnoDB 支持行级锁和表级锁&#xff0c;默认为行级锁。 &#xff08;1&#xff09;MySQL大致可以归纳为以下3种锁&#xff1a; 表级锁&#xff1a;开销小&#xff0c;加锁快&#xff1b;不会出现死锁&#xff1b;锁的粒度大…

C# FileInfo类的使用方法及常用操作(附代码示例)

在C#编程中&#xff0c;处理文件操作是一项常见而重要的任务。为了更好地管理和操作文件&#xff0c;C#提供了一个强大且灵活的FileInfo类。本文将深入探讨C# FileInfo类的使用方法&#xff0c;并为您提供一些实用的代码示例。 目录 一、什么是FileInfo类&#xff1f;二、使用F…

CLion使用SSH远程连接Linux服务器

最近要一直用实验室的服务器写Linux下的C代码, 本来一直用VScode(SSH)连接服务器, 但是我以前还是用JetBrains的IDE用的多, 毕竟他家的IDE代码提示和功能在某些细节上更加丰富。所以这次我使用了Clion里的远程连接(同样也是SSH工具)连接上了我的服务器, 实现了和VScode上同样的…

NOIP2023模拟1联测22 黑暗料理

NOIP2023模拟1联测22 黑暗料理 题目大意 自己看 思路 两个数相加能够产生质数的情况就是&#xff1a;11 或者 偶数质数 那么 1 1 1 不能保留超过一个 建一个图&#xff0c;原点连向所有奇数点&#xff0c;所有偶数点连向汇点&#xff0c;奇数点和偶数点的和为奇数的就相连 …

分布式事务 学习

分布式事务 关系型数据库事务&#xff08;本地事务&#xff09; 原子性&#xff1a;构成事务的所有操作&#xff0c;要么都执行完成&#xff0c;要么都不执行/一致性&#xff1a;在事务执行前后&#xff0c;数据库的一致性约束没有被破坏。隔离性&#xff1a;并发的两个事务的…

『第一章』命运的齿轮开始转动:雨燕(Swift)诞生!

在本篇博文中,您将学到如下内容: 1. 破茧成“燕”2. 持续进化&#xff01;3. Swift 5.0&#xff1a;ABI 稳定性4. Swift 5.1&#xff1a;模块稳定性和库进化5. Swift 5.9 来了6. 登高望远&#xff1a;Swift 6.0总结 雨燕翻新幕&#xff0c;风鹃绕旧枝 金鹊徒为滞&#xff0c;雨…

程序员的新去处?国内新能源公司大汇总!

近几年来&#xff0c;传统互联网企业哀鸿遍野&#xff0c;而新能源车企却在悄然崛起&#xff1a;HC逐年增加&#xff0c;薪资逐渐起飞&#xff0c;年终分红也让人眼红…… 聪明的程序员们已经把目光瞄准了新时代新能源车企&#xff0c;今天就带大家横向对比一下国内比较火热的…

2.7.C++项目:网络版五子棋对战之session模块的设计

文章目录 零、前置一、意义二、功能三、管理四、框架五、完整代码 零、前置 在WEB开发中&#xff0c;HTTP协议是⼀种无状态短链接的协议&#xff0c;这就导致⼀个客户端连接到服务器上之后&#xff0c;服务器不知道当前的连接对应的是哪个用户&#xff0c;也不知道客户端是否登…

24李永乐模拟6套卷中的一道定积分定义+真题改编题

大概率是武忠祥老师出的一道题&#xff0c;同时考察了数形结合&#xff0c;定积分换元&#xff0c;无穷级数表示&#xff0c;广义积分中值定理&#xff0c;定积分定义的一道真题改编好题。 第二问用第一问结论&#xff0c;区间再现一步秒杀&#xff0c;颇有真题风范。

找不到msvcp100.dll解决教程

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp100.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;本文将介绍四个修复msvcp100.dll丢失的方法&#xff0c;帮助读者快速恢复计算机的正常运…

【c++】运算符重载实例

重载自增自减运算符 Intger num(2); num; num;对自增运算符的重载要区分前置和后置。在重载之前需要思考一个问题&#xff0c;num是返回一个临时变量还是num对象的本体。 为了解决这个问题可以考虑实现一个Inc_()函数和_Inc()函数分别模仿后置和前置的行为 Integer Inc_(){i…

Calibre拾遗:FDI (Foreign Database Interface)系统简介

Calibre是强大的GDS处理工具&#xff0c;包括查看&#xff0c;验证&#xff0c;分析等操作&#xff0c;操作由浅入深&#xff0c;除过手动编辑GDS的不是很灵活外&#xff0c;其他各种命令和操作策略&#xff0c;都是远&#xff08;遥&#xff09;远&#xff08;遥&#xff09;走…

使用create-vue创建项目

认识create-vue create-vue是Vue官方新的脚手架工具&#xff0c;底层切换到了vite&#xff08;下一代构建工具&#xff09;&#xff0c;为开发提供极速响应。 使用create-vue创建项目 1.前提环境条件 已安装16.0或更高版本的Node.js node -v 2.创建一个Vue应用 npm init…

Monocular arbitrary moving object discovery and segmentation 论文阅读

基本信息 题目&#xff1a;Monocular Arbitrary Moving Object Discovery and Segmentation 作者&#xff1a; 来源&#xff1a;BMVC 时间&#xff1a;2021 代码地址&#xff1a;https://github.com/michalneoral/Raptor Abstract 我们提出了一种发现和分割场景中独立移动的…

[算法训练营] 回溯算法专题(一)

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

Linux系列讲解 —— VIM配置与美化

目录 1. Vim基本配置1.1 配置文件1.2 基本配置 2. 插件管理器Vundle2.1 下载Vundle2.2 在vimrc中添加Vundle的配置 3. Vundle的使用3.1 安装插件3.2 卸载插件 1. Vim基本配置 1.1 配置文件 vim的配置文件有两处&#xff0c;请根据实际情况选择修改哪个。 (1) 全局配置文件&am…

电子元器件管理系统 JAVA语言开发

目录 一、系统介绍 二、系统下载 三、系统截图 一、系统介绍 基于VueSpringBootMySQL的电子元器件管理系统包含元器件单位模块、元器件仓库模块、元器供应商模块、元器件品类模块、元器件明细模块、元器件采购模块、元器件采购审核模块、元器件领用模块、学生元器件申请模块…

前端AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(二)

阳光总在风雨后&#xff0c;请相信有彩虹。 案例 - 图书管理 bootstrap弹框 需求&#xff0c;点击添加按钮&#xff0c;没有离开当前页面&#xff0c;在当前页面弹出弹框&#xff08;弹窗&#xff09; 先学着实现一个简单的弹框&#xff0c;如下图右下角 bootstrap有两种方式…

openGauss学习笔记-108 openGauss 数据库管理-管理用户及权限-用户

文章目录 openGauss学习笔记-108 openGauss 数据库管理-管理用户及权限-用户108.1 创建、修改和删除用户108.2 私有用户108.3 永久用户108.4 用户认证优先规则 openGauss学习笔记-108 openGauss 数据库管理-管理用户及权限-用户 使用CREATE USER和ALTER USER可以创建和管理数据…