数据结构|排序总结(1)|直接插入排序

排序分类

插入排序:直接插入排序,希尔排序

选择排序:选择排序,堆排序

交换排序:冒泡排序,快速排序 

归并排序

插入排序

直接插入排序

        相当于摸牌,例如我们现在手上有{2,4,5,6}这些牌,当下一张是3的时候我们要将3插入到2和4当中,那么对于数组我们就要 把4,5,6 都往后挪,给3让出一个位置,这里演示以下往后挪的过程。

现有2,4,5,6

3先和6比,3应该放在6的前面,也就是3和6交换,交换后2,4,5,3,6

3再和5比,3应该放在5的前面,也就是3和5交换,交换后2,4,3,5,6

3再和4比,3应该放在4的前面,也就是3和4交换,交换后2,3,4,5,6

3再和2比,3应该放在2的后面,3本来就在2的后面,那就不用交换了,这就结束了

        很明显,这个要用到循环,既然用到,那么就要有结束条件--------插入的数大于前一个数。

        这个是一个,模拟的过程,但我们一般情况下遇到的都是一个固定长度的数组,也就是说,在不动空间的条件下只是比较交换。

        假设现在是这样的一个数组{ 2,3,1,4,2,5,2,0}我们可以先从第一2位置开始排,接着就是3,1,4...把他们放到该放的位置

先排2,结果如下

第一趟:2,3,1,4,2,5,2,0

在排3,和他前面的2进行比较,不用交换,结果如下:

第二趟:2,3,1,4,2,5,2,0

在排1,和前面的3进行比较,需要交换结果如下:

213,4,2,5,2,0

没有到达循环结束条件(插入的数大于前一个数)所以需要继续和前面的二进行比较,进行交换,结果如下:

1,2,3,4,2,5,2,0,交换后也没有到达循环结束条件,但是1的前面已经没有数了,这样也是结束了1的排序,所以上面的循环结束条件应该在加一个插入的数下标已经为0;因此第三趟排序结果为:

第三趟:1,2,3,4,2,5,2,0

剩下的数依次类推...

#include<iostream>
#include<vector>
using namespace std;
void swap(int& a, int& b)
{int tmp=a;a = b;b = tmp;}
int main()
{vector <int>arr = { 2,3,1,4,2,5,2,0};cout << "排序前:";for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';for (int i = 1; i < arr.size(); i++)//i是要排的数{int t = i;for (int j = i - 1; j >=0; j--)//{if (arr[t] < arr[j]){swap(arr[t--], arr[j]);}elsebreak;}}cout << endl<<"排序后:";for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';return 0;
}

时间复杂度分析

时间复杂度最差的时候:也就是 逆序的时候,下面是他们每次交换后的样子

#include<iostream>
#include<vector>
using namespace std;
void swap(int& a, int& b)
{int tmp=a;a = b;b = tmp;}
int main()
{vector <int>arr = {8,7,6,5,4,3,2,1,0};cout << "排序前:";for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';cout << endl<<endl;for (int i = 1; i < arr.size(); i++)//i是要排的数{int t = i;for (int j = i - 1; j >=0; j--)//{if (arr[t] < arr[j]){swap(arr[t--], arr[j]);for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';cout << endl;}elsebreak;}//cout <<"比较:"<<i<<"次"<<endl;cout << endl;}cout << endl<<"排序后:";for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';return 0;
}

每次交换的次数类似一个等差数列,因此时间复杂度就是O(n^{2})

时间复杂度最好的时候也就是正序的时候,每次交换后如下图所示:

#include<iostream>
#include<vector>
using namespace std;
void swap(int& a, int& b)
{int tmp=a;a = b;b = tmp;}
int main()
{vector <int>arr = {0,1,2,3,4,5,6,7,8};cout << "排序前:";for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';cout << endl<<endl;for (int i = 1; i < arr.size(); i++)//i是要排的数{int t = i;for (int j = i - 1; j >=0; j--)//{if (arr[t] < arr[j]){swap(arr[t--], arr[j]);for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';cout << endl;}elsebreak;}cout <<"比较:"<<i<<"次"<<endl;//cout << endl;}cout << endl<<"排序后:";for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';return 0;
}

可以看出就算本身是有序的,也得过一遍才可以,因此时间复杂度是O(n)

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

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

相关文章

AcWing 2099. 找到和最大的长度为 K 的子序列

解题思路 用数组来保存数字的出现次数。hash和set不能保存相同的键值&#xff0c;这种情况下只能用数组。 相关代码 class Solution {public int[] maxSubsequence(int[] nums, int k) {int a[] new int[nums.length];for(int i0;i<nums.length;i) a[i] nums[i];Arrays…

C/C++ 查泄漏得一些方法

在 C/C 之中内存泄漏一直是个老大难问题&#xff0c;但索性用于辅助定位查找得解决方案也不少&#xff0c;虽然没那么详细&#xff0c;但总比没有要好的多。 有一些是用三方工具来查得&#xff0c;但这个需要编译debug&#xff0c;带上符号信息得版本才可以&#xff0c;就很麻烦…

volatile 能一个非原子操作变成原子操作吗

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:volatile 能一个非原子操作变成原子操作吗 volatile 关键字在 Java 中主要用于确保多线程环境下的可见性和禁止指令重排序,但它并不能使一个非原…

碘浊度法与红外相机联用测定食品中维生素C

&#x1f31e;欢迎来到看论文的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年4月6日&…

从新手到专家:精通MacOS上的Homebrew安装

I. 前言 在介绍如何精通MacOS上的Homebrew安装之前&#xff0c;首先需要了解什么是Homebrew以及为什么要使用它。 1. Homebrew是什么&#xff1f; Homebrew是一款开源的软件包管理工具&#xff0c;可以让用户轻松地安装、升级和卸载各种软件包。与其他的软件包管理器相比&am…

PostCss:详尽指南之安装和使用

引言 在现代前端开发中&#xff0c;CSS预处理器如Sass、Less等已经成为提升开发效率、增强代码可维护性的重要工具。然而&#xff0c;随着Web技术的发展&#xff0c;CSS的功能也在不断扩展&#xff0c;一些新的CSS语法&#xff08;如变量、自定义属性、CSS Grid等&#xff09;以…

5.112 BCC工具之ext4slower.py解读

一,工具简介 ext4slower可以显示慢于阈值的ext4读取、写入、打开和fsync操作。 该工具追踪常见的ext4文件操作:读取、写入、打开和同步。它统计在这些操作中花费的时间,并打印超过阈值的每个操作的详细信息。 默认情况下,使用的最小毫秒阈值为10。 二,代码示例 #!/us…

霍兰德职业兴趣测试:发掘你的工作激情与天赋(包含开源免费的API接口)

霍兰德倾向测验的原理 霍兰德职业倾向测验&#xff0c;它是美国著名职业指导专家J&#xff0e;霍兰德&#xff08;HOLLAND&#xff09;编制的&#xff0c;他的职业选择理论把职业分为六种不同类型&#xff0c;即现实型、研究型、艺术型、社会型、企业型、常规型。霍兰德认为&a…

数据库的简单查询

一、检索一列或多列1.检索单独一列 select 列名 from 表名; select order_num from orders; 2.检索多列数据 select 列 1&#xff0c;列 2... from 表名; select order_num,order_date from orders; select order_date,order_num from orders; 3.查询所有字段 select * from…

正排索引 vs 倒排索引 - 搜索引擎具体原理

阅读导航 一、正排索引1. 概念2. 实例 二、倒排索引1. 概念2. 实例 三、正排 VS 倒排1. 正排索引优缺点2. 倒排索引优缺点3. 应用场景 三、搜索引擎原理1. 宏观原理2. 具体原理 一、正排索引 1. 概念 正排索引是一种索引机制&#xff0c;它将文档或数据记录按照某种特定的顺序…

security如何不拦截websocket

只要添加一个关键配置就行 //忽略websocket拦截Overridepublic void configure(WebSecurity webSecurity){webSecurity.ignoring().antMatchers("/**");} 全部代码我放着了 package com.oddfar.campus.framework.config;import com.oddfar.campus.framework.secur…

016——DHT11驱动开发(基于I.MX6uLL)

目录 一、 模块介绍 1.1 简介 1.2 电路描述 1.3 通信协议 二、 驱动程序 三、 应用程序 四、 上机实验 一、 模块介绍 1.1 简介 DHT11 是一款可测量温度和湿度的传感器。比如市面上一些空气加湿器&#xff0c;会测量空气中湿度&#xff0c;再根据测量结果决定是否继续加…

Cortex-M7 内存映射模型

1 前言 如图1所示&#xff0c; Cortex-M7最大支持4GB的内存寻址&#xff0c;并对内存映射(memory map)做了初步的规定&#xff0c;将整个内存空间划分为了多个内存区域(region)。每个内存区域有着既定的内存类型(memory type)和内存属性(memory attribute)&#xff0c;这两者决…

numpy学习笔记,不定期更新

numpy类型入门 import numpy库后&#xff0c;通过numpy参数操作示例 import numpy as np# 创建ndarray&#xff0c;通过list创建 a np.array([1, 2, 3]) print(a)[1 2 3]# 通过元组创建ndarray&#xff0c;并指定数据类型为float (此处是python的float类型&#xff0c;不是n…

从石膏像到真人:素描的进步之路

从石膏像绘画到真人绘画&#xff1a;素描的进步之路怎么走 从石膏像绘画到真人绘画&#xff0c;素描的进步之路可以通过以下几个步骤来实现&#xff1a; 掌握基本技能&#xff1a;在开始真人绘画之前&#xff0c;需要先掌握基本的素描技能&#xff0c;包括构图、明暗关系、观察…

物理层习题及其相关知识(谁看谁不迷糊呢)

1. 对于带宽为50k Hz的信道&#xff0c;若有4种不同的物理状态来表示数据&#xff0c;信噪比为20dB 。&#xff08;1&#xff09; 按奈奎斯特定理&#xff0c;信道的最大传输数据速率是多少&#xff1f;&#xff08;2&#xff09; 按香农定理&#xff0c;信道的最大传输数据速度…

PSI相关存档

https://anquan.baidu.com/upload/ue/file/20190814/1565763561975581.pdf 关于PSI的研究综述_psi综述-CSDN博客 https://zhuanlan.zhihu.com/p/532761749 https://zhuanlan.zhihu.com/p/407290294 隐私集合求交(Private Set Intersection)问题综述 - 知乎 (zhihu.com) Pr…

基于Springboot+Vue实现前后端分离酒店管理系统

一、&#x1f680;选题背景介绍 &#x1f4da;推荐理由&#xff1a; 近几年来&#xff0c;随着各行各业计算机智能化管理的转型&#xff0c;以及人们经济实力的提升&#xff0c;人们对于酒店住宿的需求不断的提升&#xff0c;用户的增多导致酒店管理信息的不断增多&#xff0c;…

ICLR 2024 | 联邦学习后门攻击的模型关键层

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 联邦学习使多个参与方可以在数据隐私得到保护的情况下训练机器学习模型。但是由于服务器无法…

华为分红出炉,人均超50w!

华为分红 770 亿 4 月 2 日&#xff0c;北京金融资产交易所官网发布了《华为投资控股有限公司关于分配股利的公告》。 公告指出&#xff1a;经公司内部有权机构决议&#xff0c;拟向股东分配股利约 770.945 亿元。 众所周知&#xff0c;华为并不是一家上市公司&#xff0c;这里…