算法 -选择排序

博客主页:【夜泉_ly】
本文专栏:【算法】
欢迎点赞👍收藏⭐关注❤️

在这里插入图片描述

文章目录

  • 💡选择排序
    • 1. 🔄 选择排序
      • 🖼️示意图
      • 📖简介
      • 💡实现思路1
      • 💻代码实现1
      • 💡实现思路2
      • 💻代码实现2
    • 2. 🏰 堆排序
      • 🖼️示意图
      • 📖简介
      • 💡实现思路
      • 💻代码实现

💡选择排序

选择排序分为选择排序和堆排序。


1. 🔄 选择排序

🖼️示意图

选择排序 − 示意图 选择排序 -示意图 选择排序示意图
在这里插入图片描述

📖简介

选择排序是一种比较简单直观的排序,其思想就是不断从待排序的数组中选出符合要求的数据。

由于每次选数要遍历一遍数组,而重复次数为数组长度,因此时间复杂度为 O ( N 2 ) O(N^2) O(N2)。实际用处不大,因为它不会管数据长什么样,都会从头遍历到尾,不如直接插入排序。这也给了我们一个启示:斗地主发牌时,要边拿牌边排序(插入排序),不能拿到一把牌后再排序(选择排序)。

💡实现思路1

  • 定义一个指针 end ,初始为-1,表示已排序数组的结束位置。(最开始还没有选出最小值,所以是 -1)
  • 选择,用一个指针 curend + 1遍历到尾,用另一个指针 min 记录最小值的位置。
  • 交换,将 end + 1 处的值与 min 处的值交换。
  • end++,继续下一轮。
  • 结束条件为 end >= size - 1 ,即所有元素都已排序。

💻代码实现1

void SelectSort(int* arr, int size)
{int end = -1;while (end < size - 1){int cur = end + 1;int min = cur;while (cur < size){if (arr[cur] < arr[min])min = cur;cur++;}swap(arr[end + 1], arr[min]);end++;}
}

当然,还可以稍微优化一下,即将 end 改为 left ,同时增加一个指针 right

💡实现思路2

  • 定义一个指针 left ,初始为-1,表示选出最小元素的结束位置。
  • 定义一个指针 right ,初始为size,表示选出最大元素的结束位置。
  • 选择,用一个指针 curleft + 1遍历到 right - 1,用两个指针 minmax 记录最小、大值的位置。
    • 交换时,如果 left + 1处的值为最大值,即left + 1 == max,交换left + 1min后,left + 1处变为最小值,min处变为最大值。因此,为了保证交换的正确性,在这种情况下可以让 max = min
  • 交换,将 left + 1 处的值与 min 处的值交换,将 right - 1 处的值与 max 处的值交换。
  • left++,right--,继续下一轮。
  • 结束条件为 left >= right ,即所有元素都已排序。

💻代码实现2

void SelectSort2(int* arr, int size)
{int left = -1, right = size;while (left < right){int cur = left + 1;int max = cur, min = cur;while (cur < right){if (arr[cur] > arr[max])max = cur;if (arr[cur] < arr[min])min = cur;cur++;}if (max == left + 1)max = min;swap(arr[left + 1], arr[min]);swap(arr[right - 1], arr[max]);left++, right--;}
}

2. 🏰 堆排序

堆排序,这个我在数据结构-堆-详解中也讲过.

🖼️示意图

堆排序 − 示意图 堆排序 -示意图 堆排序示意图
在这里插入图片描述

📖简介

即使用堆进行排序。

💡实现思路

给一个数组,要使用堆排,前提是必须有个堆,因此第一步为建堆。
那么,建大堆还是小堆?怎么建堆?
建什么堆,这里有个规律:

  • 升序建大堆
  • 降序建小堆

如何建堆,有两种方法:

  • 使用向上调整法,插入建堆
  • 使用向下调整法,调整建堆

建堆
向上调整法

void HeapSort(int* a, int n)
{//建堆for (int i = 0; i < n; i++){AdjustUp(a, i);}//排序
}

向下调整法
使用向下调整法建堆,需满足左、右子树必须是堆
随便给的数组肯定不能满足此条件,因此不能从根节点开始建堆,需要找倒数第一个非叶子节点:
在这里插入图片描述
叶节点是堆,空节点也是堆,因此,从第一个非叶子节点开始使用向下调整法,不断调整直到根节点。

void HeapSort(int* a, int n)
{//建堆for (int i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDown(a, n, i);}//排序
}

在实际使用中,通常使用向下调整法建堆,因为向上调整法的时间复杂度为O(N*logN),而向下调整法的时间复杂度为O(N)
排序
这里使用的是堆删除的思想来排序。
现在假设排升序,并且已经建好了一个大堆:
在这里插入图片描述
在这里插入图片描述
Pop一下,最大的就跑最后去了,然后重复此过程,就能排成升序。
这也验证了:

  • 升序建大堆
  • 降序建小堆

💻代码实现

void AdjustDown(int* a, int n, int parent)
{assert(a);int child = parent * 2 + 1;while (child < n){if ((child + 1) < n && a[child] < a[child + 1])child++;if (a[parent] < a[child])Swap(a + parent, a + child);elsebreak;parent = child;child = parent * 2 + 1;}
}void HeapSort(int* a, int n)
{//建堆for (int i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDown(a, n, i);}//排序int size = n;while (size--){Swap(a, a + size);AdjustDown(a, size, 0);}
}

在这里插入图片描述


希望本篇文章对你有所帮助!并激发你进一步探索编程的兴趣!
本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!

相关文章:
算法 -插入排序
算法 -交换排序

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

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

相关文章

ubuntu 22.04 镜像源更换

双11抢了个云服务器&#xff0c;想要整点东西玩玩&#xff0c;没想到刚上来就不太顺利 使用sudo apt update更新软件&#xff0c;然后发生了如下报错 W: Failed to fetch http://mirrors.jdcloudcs.com/ubuntu/dists/jammy/InRelease 理所当然想到可能是镜像源连接不是很好&…

2016年7月29日至2017年2月21日NASA大气层层析(ATom)任务甲醛(HCHO)、羟基(OH)和OH生产率的剖面积分柱密度

目录 简介 摘要 引用 网址推荐 知识星球 机器学习 ATom: Column-Integrated Densities of Hydroxyl and Formaldehyde in Remote Troposphere ATom&#xff1a; 远对流层中羟基和甲醛的柱积分密度 简介 该数据集提供了甲醛&#xff08;HCHO&#xff09;、羟基&#xff…

一夜吸粉10万!AI妖精变身视频如何做的?5分钟你也能赶上末班车!

本文背景 最近有小伙伴跟我发了一个AI视频&#xff0c;问我是怎么做的&#xff1f; 很多人在各大自媒体平台&#xff0c;像某音、蝴蝶号都刷到过下面这种妖精变身的短视频。 我也常刷到&#xff0c;从这类视频能看到点赞、收藏、评论的数据都特别高&#xff0c;动不动就几千、几…

【JAVA项目】基于jspm的【医院病历管理系统】

技术简介&#xff1a;采用jsp技术、MySQL等技术实现。 系统简介&#xff1a;通过标签分类管理等方式&#xff0c;实现管理员&#xff1b;个人中心、医院公告管理、用户管理、科室信息管理、医生管理、出诊信息管理、预约时间段管理、预约挂号管理、门诊病历管理、就诊评价管理、…

Oasis:首个可玩的AI生成互动游戏

游戏玩法介绍 Oasis 是由AI公司Decart开发的一款实时生成、可交互的Minecraft风格游戏。这款游戏利用生成式AI技术,创造出独特的“开放世界”体验。Oasis基于大量Minecraft游戏视频进行训练,通过键盘和鼠标输入实时生成游戏画面,模拟物理效果、规则及视觉效果。用户在游戏中…

Python网络爬虫入门篇!

预备知识 学习者需要预先掌握Python的数字类型、字符串类型、分支、循环、函数、列表类型、字典类型、文件和第三方库使用等概念和编程方法。 2. Python爬虫基本流程 a. 发送请求 使用http库向目标站点发起请求&#xff0c;即发送一个Request&#xff0c;Request包含&#xf…

【C++】踏上C++学习之旅(五):auto、范围for以及nullptr的精彩时刻(C++11)

文章目录 前言1. auto关键字&#xff08;C11&#xff09;1.1 为什么要有auto关键字1.2 auto关键字的使用方式1.3 auto的使用细则1.4 auto不能推导的场景 2. 基于范围的for循环&#xff08;C11&#xff09;2.1 范围for的语法2.2 范围for的使用条件 3. 指针空值nullptr&#xff0…

科研绘图系列:R语言组合多个不同图形(violin density barplot heatmap)

文章目录 介绍加载R包数据下载函数图1: Boxplots导入数据数据预处理画图图2: Violin导入数据数据预处理画图图3: Density plots per habitat数据预处理画图图4: Density plots per depth数据预处理画图图5: bar plot准备颜色导入数据数据预处理数据预处理画图图6: Mantel Heat…

系统聚类的分类数确定——聚合系数法

breast_cancer数据集分析——乳腺癌诊断 #读取乳腺癌数据 import pandas as pd import numpy as np from sklearn.datasets import load_breast_cancer data load_breast_cancer() X data.data y data.target.. _breast_cancer_dataset:Breast cancer wisconsin (diagnosti…

jsp+sevlet+mysql实现用户登陆和增删改查功能

jspsevletmysql实现用户登陆和增删改查功能 一、系统介绍二、功能展示1.用户登陆2.用户列表3.查询用户信息4.添加用户信息5.修改用户信息6.删除用户信息 四、其它1.其他系统实现 一、系统介绍 系统主要功能&#xff1a; 用户登陆、添加用户、查询用户、修改用户、删除用户 二…

一文了解Java序列化

Java 序列化&#xff08;Serialization&#xff09;是将对象的状态转换为字节流&#xff0c;以便将对象的状态保存到文件中或通过网络传输的过程。反序列化&#xff08;Deserialization&#xff09;则是将字节流恢复为原始对象。Java 序列化主要通过 Serializable 接口实现。 为…

斗破QT编程入门系列之前言:认识Qt:获取与安装(四星斗师)

本系列是在学习完C之后&#xff0c;然后通过Qt构建界面来&#xff0c;赋予枯燥的代码新的样貌&#xff0c;这样我们才能开发出更人性化的程序&#xff0c;同时会进一步提高初学者对编程的兴趣&#xff0c;大家加油&#xff0c;斗破Qt来了。 斗破Qt目录&#xff1a; 斗破Qt编程…

Spring Boot - 扩展点 EnvironmentPostProcessor源码分析及真实案例

文章目录 概述EnvironmentPostProcessor 作用EnvironmentPostProcessor 实现和注册创建类并实现接口注册到 Spring Boot常见应用场景 源码分析1. EnvironmentPostProcessor 接口定义2. 扩展点加载流程3. 加载 EnvironmentPostProcessor 实现类4. EnvironmentPostProcessor 执行…

封装的数字滚动组件的实现代码

效果&#xff1a; 学习啦&#xff1a; Vue 是一个渐进式框架&#xff0c;鼓励通过组件化来构建应用&#xff0c;其组件化优势&#xff1a; 代码复用&#xff1a;不同的视图和功能被封装成独立的组件&#xff0c;便于复用。易于维护&#xff1a;每个组件职责单一、耦合度低&…

Unity跨平台基本原理

目录 前言 ​编辑 Mono Unity和Mono的关系 Unity跨平台必备概念 Mono利用 Mono主要构成部分 基于Mono跨平台的优缺点 IL2CPP Mono和IL2CPP的区别 Mono IL2CPP Mono和IL2CPP的使用建议 安装IL2CPP IL2CPP打包存在的问题 类型裁剪 泛型问题 前言 Unity跨平台的基…

计算机网络(3)

UDP是面向无连接的通信协议&#xff0c;UDP数据包括目的端口号和源端口号信息&#xff0c;由于 不需要连接&#xff0c;所以可以实现广播发送&#xff1b; 传输控制层 UDP协议&#xff08;用户数据报协议&#xff09; UDP通信时不需要接收方确认&#xff0c;属于不可靠的传输&a…

2024年11月8日上海帆软用户大会

2024年11月8日上海帆软用户大会 2024年11月8日&#xff0c;上海成功举办了帆软用户大会&#xff0c;主题为“数字聚力&#xff0c;绽放新机”。大会汇聚了众多行业专家和企业代表&#xff0c;共同探讨数字化转型和商业智能领域的最新趋势和实践。 大会亮点&#xff1a; 专家…

PySimpleGUI和Pymysql

PySimpleGUI 库 PySimpleGUI 是一个用于简化 GUI 编程的 Python 包&#xff0c;它封装了多种底层 GUI 框架&#xff08;如 tkinter、Qt、WxPython 等&#xff09;&#xff0c;提供了简单易用的 API。PySimpleGUI 包含了大量的控件&#xff08;也称为小部件或组件&#xff09;&…

Qt Event事件系统小探1

目录 Qt Event System From qt.doc 如何传递事件 事件类型 事件处理程序 事件过滤器 发送事件 事件的产生和派发 处理我们的事件 来一段好玩的代码 扩展&#xff1a;QWidget如何处理我们的事件&#xff1f; 扩展2&#xff1a;实现一个变色的Label Qt Event System Fr…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于凸多面体仿射变换的用户侧灵活性资源多元聚合方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…