C++知识点总结(15):选择排序、插入排序

文章目录

  • 一、选择排序
    • 1. 概念
    • 2. 伪代码
    • 3. 程序
    • 4. 例题
      • 第k大的数
  • 二、元素插入
    • 1. 伪代码
    • 2. 程序
  • 三、插入排序
    • 1. 概念
    • 2. 伪代码
    • 3. 程序
    • 4. 例题
      • 洛谷 P1152
  • 四、分析

一、选择排序

1. 概念

下标12345最小值
原始43521/
第一次135241
第二次125342
第三次123543
第四次123454
完成12345/

选择排序
从待排序的区间中找到最小元素的位置,并将该元素与该区间的第一个元素交换位置。这样通过 n − 1 n-1 n1 次选择未排序部分的最小元素,将其放在正确位置从而达到对整个序列进行排序的效果。

2. 伪代码

for (i = 1 ~ n-1) # 轮数int minp = i; # 设擂主(位置)for (j = i+1 ~ n) # 打擂台if (a[j] < a[minp])minp = j;end ifend forswap(a[i], a[minp]);
end for

3. 程序

#include <iostream>
using namespace std;int n;
int a[1005];void selectionSort(int a[], int n)
{for (int i = 1; i <= n-1; i++){int minp = i; // 设擂主所在的下标 for (int j = i+1; j <= n; j++) // 打擂台 {if (a[j] < a[minp]){minp = j;}}swap(a[i], a[minp]);}
}int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];}selectionSort(a, n);for (int i = 1; i <= n; i++){cout << a[i] << " ";}return 0;
}

代码分析:
我们以7 2 5 8 1为例。

ia[]minpja[]操作
-7 2 5 8 1--7 2 5 8 1-
17 2 5 8 1521 2 5 8 7交换 7 和 1
21 2 5 8 7231 2 5 8 7无需交换
31 2 5 8 7341 2 5 8 7交换 5 和 3
41 2 5 8 7--1 2 5 8 7无需交换

4. 例题

第k大的数

#include <iostream>
using namespace std;int n, k;
int a[100005];void selectionSort(int a[], int n, int k)
{for (int i = 1; i <= k; i++){int maxp = i; // 设擂主所在的下标 for (int j = i+1; j <= n; j++) // 打擂台 {if (a[j] > a[maxp]){maxp = j;}}swap(a[i], a[minp]);}
}int main()
{cin >> n >> k;for (int i = 1; i <= n; i++){cin >> a[i];}selectionSort(a, n, k);cout << a[k];return 0;
}

二、元素插入

1. 伪代码

int x, pos = n+1;
# * x: 待插入的元素
# * pos: 比较的下标
for (j = n ~ 1)if x < a[j]a[j+1] = a[j];pos--;elsebreak;end if
end for
a[pos] = x;

2. 程序

#include <iostream>
using namespace std;int n, x, pos;
int a[10005];void insertionSort(int a[], int n, int x)
{pos = n + 1;for (int i = n; i >= 1; i--){if (x < a[i]){a[i+1] = a[i];pos = i;}else{break;}}a[pos] = x;
}int main()
{cin >> n >> x;for (int i = 1; i <= n; i++){cin >> a[i];}insertionSort(a, n, x);for (int i = 1; i <= n; i++){cout << a[i] << " "; }return 0;
}

三、插入排序

1. 概念

插入排序
将待排序元素依次插到已排序序列中的恰当位置,最终形成有序序列的方法。

2. 伪代码

for (i = 2 ~ n)int x = a[i], pos = i;for (j = i-1 ~ 1)if (x < a[j])a[j+1] = a[j]pos--;elsebreakend ifend fora[pos] = x;
end for

3. 程序

#include <iostream>
using namespace std;int n, x, pos;
int a[100005];void insertionSort(int a[], int n)
{for (int i = 2; i <= n; i++){x = a[i];pos = i;for (int j = i-1; j >= 1; j--){if (x < a[j]){a[j+1] = a[j];}else{break;}}a[pos] = x;}
}int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];}// ...return 0;
} 

4. 例题

洛谷 P1152

#include <iostream>
using namespace std;int n, x, pos;
int a[1005], b[1005];void insetionSort(int a[], int n) 
{for (int i = 2; i <= n; i++){x = a[i];pos = i;for (int j = i-1; j >= 1; j--){if (x < a[j]){a[j+1] = a[j];pos = j;}else{break;}}a[pos] = x;}
}int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];}for (int i = 1; i <= n-1; i++){b[i] = abs(a[i+1] - a[i])}insertionSort(b, n-1);for (int i = 1; i <= n-1; i++){if (b[i] != i){cout << "Not jolly";return 0;}}cout << "Jolly";return 0;
}

四、分析

排序算法时间复杂度空间复杂度稳定性
冒泡排序 O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)稳定
选择排序 O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)不稳定
插入排序 O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)稳定

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

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

相关文章

C++ 调用js 脚本

需求&#xff1a; 使用Qt/C 调用js 脚本。Qt 调用lua 脚本性能应该是最快的&#xff0c;但是需要引入第三方库&#xff0c;虽然也不是特别麻烦&#xff0c;但是调用js脚本&#xff0c;确实内置的功能&#xff08;C 调用lua 脚本-CSDN博客&#xff09; 步骤&#xff1a; 1&…

解决elementUI固定列后,下方多了一条横线的问题

最近遇到一个bug,如下图,el-table的操作列使用fixed属性固定后,下方多了一条横线: 我们将样式设置高优先,以覆盖内联样式,如下是less里使用穿透样式解决的办法: <style lang="less" scoped> /deep/ .el-table__fixed-right {height: 100

go内置库函数实现client与server数据的发送接收

功能&#xff1a;客户端持续写入数据&#xff0c;直到输入exit退出&#xff0c;服务端读取数据并打印 注意&#xff1a;server和client目录在同一层级 服务端 server/main package mainimport ("fmt""net" )func main() {listen, err : net.Listen(&quo…

【牛客 NC253455】小红走排列 题解(链表+位集合+贪心算法)

题目描述 对于一个排列&#xff0c;小红定义该排列的总消耗为&#xff1a;1走到2&#xff0c;2走到3&#xff0c;……&#xff0c;最终从 n − 1 n-1 n−1走到 n n n所需的最少的总步数。其中&#xff0c;每一步可以向左走一步&#xff0c;也可以向右走一步。 现在&#xff0…

Kubernetes基础(二十一)-k8s的服务发现机制

1 概述 Kubernetes&#xff08;K8s&#xff09;是一个强大的容器编排平台&#xff0c;提供了丰富的功能来简化容器化应用的管理。其中之一重要的特性就是服务发现机制&#xff0c;它使得应用程序能够在K8s集群中动态地发现和访问其他服务。本文将深入研究K8s中的服务发现机制&…

Java基础知识学习:深入理解Java中的类与对象,Java重要知识点概念性解释,结合实例讲解请看下一篇博文

引言&#xff1a; 在Java编程语言中&#xff0c;类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心概念。类可以看作是创建对象的蓝图&#xff0c;而对象则是类的实例。本文将深入解释Java知识体系中的类与…

unity学习(25)——客户端与服务器合力完成注册功能(7)逻辑流程彻底解决

在服务器LoginHandler类中&#xff1a; public void login(Session session, SocketModel model) {LoginDTO loginDto Coding<LoginDTO>.decode(model.Message);//MyLog.form.textAdd("用户申请登录" loginDto.userName " " loginDto.pass…

2024/2/18 图论 最短路入门 floyd 1

目录 Floyd求最短路 854. Floyd求最短路 - AcWing题库 模板】Floyd B3647 【模板】Floyd - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Floyd求最短路 854. Floyd求最短路 - AcWing题库 思路&#xff1a;在代码里面 完整代码&#xff1a; #include <bits/stdc.h&g…

Quartz---JobDataMap使用的两种方式

任务调度执行原理图&#xff1a; JobDataMap的使用 JobDataMap是Quartz调度器中的一个重要组件&#xff0c;主要用于存储和传递与作业&#xff08;Job&#xff09;相关的数据。它是一个实现了Java Map接口的对象&#xff0c;可以用来保存一系列的序列化的对象。这些对象在作业执…

Langchain的提示词模板

因为做AI项目的过程中&#xff0c;需要处理各种提示词&#xff08;prompt&#xff09;&#xff0c;其中有些是固定的文本&#xff0c;有些是会反复修改的。如果是简单的提示词&#xff0c;直接用python里面的字符串format()或者replace()函数进行处理即可。对于复杂的&#xff…

强大的蓝牙工具Ubertooth系列

Ubertooth One 是一个开源的蓝牙嗅探设备&#xff0c;它提供了多个软件工具来进行蓝牙通信的分析、监视和探测。以下是 Ubertooth One 的一系列软件工具的介绍&#xff1a; Ubertooth&#xff1a;Ubertooth 是 Ubertooth One 的核心驱动程序和硬件抽象层。它允许与 Ubertooth O…

Oracle大型数据库技术

实验环境 sqlplus 记录实验过程的方法&#xff1a; spool 带有绝对路径的文件名 [append] --SQL语句 spool off开启相关服务 oracleserviceORCL 控制面板–管理–服务–找到后开启命令行方法&#xff1a; cmd–net start|stop oracleserviceorcl 常用操作 显示当前用户名 sho…

IPv4编址方式

IPv4编址方式 本文的知识都可以到B站up湖科大教书匠的视频里去看具体讲解。 分类地址 IPv4地址被分为网络号和主机号&#xff0c;可分为A类地址、B类地址、C类地址、D类地址、E类地址。其中&#xff0c;只有A类、B类、C类地址的可用于给网络中的主机编址。 A类地址的网络号…

京东Java实习一面

第一次面试&#xff0c;被狠狠地拷打了 1.自我介绍 2.谈一谈你项目中比较难的一个点 3.为什么选择用两级缓存? 4.缓存和数据库数据一致性是如何保证的? 5.缓存遇到并发查询的情况怎么办? 6.synchronized和其它锁有什么区别? 7.Elasticsearch中用到了哪些类型?document是如…

【Jvm】性能调优(下)线上问题排查思路汇总

文章目录 前言性能调优&#xff08;上&#xff09;线上问题排查工具汇总JVM调优&#xff08;中&#xff09;Java中不得不了解的OOM Error 一.JVM参数1.参数分类2.非稳定参数&#xff08;-XX&#xff09;说明3.查询JVM默认参数及运行时生效参数4.常用参数5.GC日志相关参数6.发生…

嵌入式系统在智慧城市建设中的关键角色与挑战

&#xff08;本文为简单介绍&#xff0c;观点源于网络&#xff09; 智慧城市的概念&#xff0c;随着信息技术的日益发展而不断深化。它利用各种信息传感器&#xff0c;通过物联网、云计算、大数据等技术手段&#xff0c;实现城市管理的智能化、精细化。在这一过程中&#xff0…

jvm、jre、jdk的关系

jvm Java 虚拟机&#xff08;JVM&#xff09;是运行 Java 字节码的虚拟机。 jre JRE&#xff08;Java Runtime Environment&#xff09; 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合&#xff0c;主要包括 Java 虚拟机&#xff08;JVM&#xff09;、J…

沁恒CH32V30X学习笔记06---串口dma接收+空闲中断组合接收数据

DMA 控制器提供 18 个通道,其中 DMA1 包含 7 个通道,DMA2 包含 11 个通道,每个通 道对应多个外设请求,通过设置相应外设寄存器中对应 DMA 控制位 通道映射 dma1 dma2 示例代码 bsp_usart_it.c /** bsp_usart_it.c** Created on: 2024年2月18日* Author: admin*/…

如何使音频类app广告变现收益最大化

要使音频类应用程序的广告变现收益最大化&#xff0c;可以采取以下策略&#xff1a; admaoyan猫眼聚合 精准定位受众&#xff1a; 了解你的用户群体&#xff0c;包括他们的兴趣、偏好和行为&#xff0c;以便向他们展示相关性更高的广告。使用用户数据分析工具&#xff0c;如Goo…

SPSSAU【文本分析】|LDA主题分析

LDA主题分析 LDA主题分析是一种提取出文本数据核心主题的模型&#xff0c;其可将整份数据文档的信息提取成几个主题&#xff0c;并且标题出主题与关键词之间的权重情况&#xff0c;用于识别主题的具体实际意义&#xff0c;除此之外&#xff0c;LDA主题分析涉及到可视化展示和图…