【排序算法】三、选择排序(C/C++)

「前言」文章内容是排序算法之选择排序的讲解。(所有文章已经分类好,放心食用)

「归属专栏」排序算法

「主页链接」个人主页

「笔者」枫叶先生(fy)

目录

  • 选择排序
    • 1.1 原理
    • 1.2 代码实现(C/C++)
    • 1.3 优化
    • 1.3 特性总结

选择排序

1.1 原理

选择排序是一种简单直观的排序算法

它的工作原理是:

  • 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置
  • 然后再从剩余的未排序元素中继续寻找最小(或最大)的元素,依次类推,直到所有元素排序完毕

选择排序:基于数组(顺序表)的结构进行排序

例如

原始数组如下,使用选择排序进行排序,选最小元素进行交换(升序)
在这里插入图片描述
遍历第一趟数组,找出数组的最小值,与第一个数据交换
在这里插入图片描述

遍历第二趟数组,继续找出最小值,与第二个数据交换
在这里插入图片描述
重复上述动作,直到数组有序

动图演示:(下列是选最小)

在这里插入图片描述

1.2 代码实现(C/C++)

C语言代码如下:(升序)

void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}// 选择排序(以下代码是选最小)
void SelectSort(int* arr, int n)
{for (int i = 0; i < n; ++i){int min = i; // 记录最小值元素的下标int start = i + 1;while (start < n){if (arr[start] < arr[min]) min = start; // 最小值的下标更新++start;}Swap(&arr[i], &arr[min]); // 交换两个元素}
}

C++代码:(升序)

// 选择排序(以下代码是选最小)
void SelectSort(vector<int>& arr)
{int n = arr.size();for (int i = 0; i < n; ++i){int min = i; // 记录最小值元素的下标int start = i + 1;while (start < n){if (arr[start] < arr[min]) min = start; // 最小值的下标更新++start;}swap(arr[i], arr[min]); // 交换}
}

1.3 优化

实际上,我们可以一趟选出两个值,一个最大值一个最小值,然后将其放在序列开头和末尾,这样可以使选择排序的效率快一倍

例如

原始数组如下,使用选择排序进行排序,一趟选出最小和最大元素进行交换
在这里插入图片描述
变量left和变量right是数组的两端,minimaxi分别代表最小和最大元素的下标
在这里插入图片描述
重复上述动作,直到数组有序

优化后的问题

如果maxi的位置与left重合,则left先与mini的位置交换,此时maxi位置的最大值被交换走,导致riightmaxi交换的数值是错误的(图中的0是10,打少了一个1)
在这里插入图片描述
left先与mini的位置交换数据,此时maxi位置的已经不是最大值了(图中的0是10,打少了一个1)

在这里插入图片描述
接着maxi再与right位置交换数据,排序就发生了错误
在这里插入图片描述

解决

​当maxileft重合时,leftmini交换后导致maxi指向的不再是最大值,所以当我们对left交换后,就要对maxi进行一个修正,让maxi指向最大值,然后完成right的交换,如下:

maxileft重合,并且left此时完成了交换,此时最大值已经交换到了mini所指向的位置
在这里插入图片描述
然后对maxi进行修正后,maxi = mini,再完成与right的交换
在这里插入图片描述
此时便解决了该问题

C++代码如下:

// 选择排序(选两个: 最小和最大)
void SelectSort(vector<int>& arr)
{int n = arr.size();int left = 0, right = n - 1; // 保存单趟排序的第一个数和最后一个数下标while (left < right){int mini = left, maxi = left; // 保存最小值和最大值的下标// 选出最小值和最大值的下标for (int i = left + 1; i <= right; i++){if (arr[mini] > arr[i]) mini = i;if (arr[i] > arr[maxi]) maxi = i;}// 最小值放在 arr[left]swap(arr[left], arr[mini]);// left 和 maxi 重叠的时候, 上一步已经把最大值换到 arr[mini] 中去了, 修正一下最大值 maxi 位置即可if (left == maxi) maxi = mini;// 最大值放在 arr[end] swap(arr[right], arr[maxi]);left++;right--;}
}

1.3 特性总结

选择排序特性总结

  • 选择排序思考非常好理解,但是效率不是很好,实际中很少使用
  • 时间复杂度:O(N^2)
  • 空间复杂度:O(1)
  • 稳定性:不稳定
  • 适用范围:选择排序适用于小规模数据的排序,对于大规模数据效率较低

--------------------- END ----------------------

「 作者 」 枫叶先生
「 更新 」 2024.1.11
「 声明 」 余之才疏学浅,故所撰文疏漏难免,或有谬误或不准确之处,敬请读者批评指正。

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

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

相关文章

Unity Meta Quest 一体机开发(十三):【手势追踪】自定义交互事件 EventWrapper

文章目录 &#x1f4d5;教程说明&#x1f4d5;交互事件概述&#x1f4d5;自定义交互逻辑⭐方法一&#xff1a;Inspector 面板赋值⭐方法二&#xff1a;纯代码处理 此教程相关的详细教案&#xff0c;文档&#xff0c;思维导图和工程文件会放入 Spatial XR 社区。这是一个高质量…

cuda12.0 安装 pytorch

前两天买的y7000p到了&#xff0c;然后就要重新配下环境。 流程如下 首先下载miniconda &#xff0c;我下的是python3.8的创建自己的自定义环境检查自己的cuda版本&#xff0c;我的是cuda:12.0然后再pytorch上找到对应cuda版本的进行下载&#xff0c;pip install或者conda in…

工作每天都在用的 DNS 协议,你真的了解么?

我们经常访问一些网址的时候&#xff0c;浏览器里输入类似于 www.baidu.com 这样的地址&#xff0c;那么在浏览器里输入这个地址---> 百度服务器给我们返回这个百度的页面&#xff0c;中间的过程是什么样的呢&#xff1f; 带着这个问题&#xff0c;我们一起来解析一下其中的…

肺癌文献阅读2

第四篇 Neoadjuvant therapy in non-small cell lung cancer IF:6.2 中科院分区:2区 医学WOS 分区:Q1 之前有了解到新辅助治疗与辅助治疗都是在术前为增加疗效而进行的&#xff0c;这篇文章讲到I-III期的NSCLC更倾向于切除&#xff0c;这个时间点可分为早期与晚期。这个III期应…

Qt获取字符串大小

可以用成员函数size、length和count来获取字节数组的大小。除了名字不同&#xff0c;这3个函数是等同的&#xff0c;函数的原型声明如下&#xff1a; int size(); int length(); int count(); 这3个函数返回字节数组中的字节数。Size()函数的用法如下&#xff1a; QByteAr…

代码随想录day2:数组part02(有序数组的平方 ,长度最小的子数组 ,螺旋矩阵II,数组章节总结)

数组part02 一、有序数组的平方 法一&#xff1a;暴力&#xff0c;先把每个元素平方再排序&#xff0c;时间复杂度O(n nlogn) class Solution { public:vector<int> sortedSquares(vector<int>& nums) {for(int i0;i<nums.size();i) nums[i]*nums[i];so…

Domino自带应用免费开源,免费共享

大家好&#xff0c;才是真的好。 作为一个强大的、综合性的、高安全的企业级应用平台&#xff0c;Domino同时也拥有业界首屈一指的应用程序开发能力。不过&#xff0c;让Domino有强大竞争力的&#xff0c;也应该包含它自带的数十个开箱即用的Notes应用程序。 我在前面很多篇幅…

JavaScript-BOM-笔记

1.页面加载 一般情况:先写标签,再写js 页面加载:可以实现先写js代码 再写标签 window.onload = function(){ js代码 } 只能写一次,如果多次以最后一次为准 window.addEventListener(load,function(){ 代码 }) 使用多次 window.onload = function () { console.log(doc…

c++的this指针

this指针是c类中的概念&#xff0c;this英文翻译是这&#xff0c;这个&#xff0c;其实在类中就是这个意思。 this指针的使用 this指针主要用于类中的非静态成员方法&#xff0c;在这些方法中&#xff0c;this指针就指向当前调用此方法的这个对象。 1. this的使用场景一: 当…

2024年人工智能有哪些证书可以报考呢?

由国家工信部权威认证的人工智能证书是跨入人工智能行业的敲门砖&#xff0c;随着人工智能技术的发展越来越成熟&#xff0c;相关的从业人员也会剧增&#xff0c;证书的考取难度也会变高。如果已经从事或者准备从事人工智能行业的人员&#xff0c;对于考证宜早不宜迟&#xff0…

数据库软件详解一

MySQL 的安装 MySQL 的安装可去参考下这篇文章&#xff0c;比较详细&#xff0c;在此就不多啰嗦了&#xff01; MySQL 的卸载 如果你并不是第一次安装 MySQL &#xff0c;或者安装 MySQL 不对&#xff0c;需要将 MySQL 卸载干净才能将下一个版本的 MySQL 安装成功 卸载步骤 …

Javaweb之SpringBootWeb案例开发规范的详细解析

1.2 开发规范 了解完需求也完成了环境搭建了&#xff0c;我们下面开始学习开发的一些规范。 开发规范我们主要从以下几方面介绍&#xff1a; 1、开发规范-REST 我们的案例是基于当前最为主流的前后端分离模式进行开发。 在前后端分离的开发模式中&#xff0c;前后端开发人员…

uniapp 设置底部导航栏

uniapp 设置原生 tabBar 底部导航栏。 设置底部导航栏 一、创建页面&#xff0c;一定要在 pages.json 文件中注册。 二、在 pages.json 文件中&#xff0c;设置 tabBar 配置项。 pages.json 页面 {"pages": [...],"globalStyle": {...},"uniIdRout…

Flex布局--常用好用

1.什么是Flex布局&#xff1f; flex 是 flexible Box 的缩写&#xff0c;意为"弹性布局"&#xff0c;用来为盒状模型提供最大的灵活性&#xff0c;任何一个容器都可以 指定为 flex 布局。 当我们为父盒子设为 flex 布局以后&#xff0c;子元素的 float、clear 和 ve…

地推拉新任务管理助手程序开发

拉新地推任务管理分销助手程序开发&#xff0c;旨在为企业提供一套专业、高效的管理工具&#xff0c;以优化地推任务分配、提高销售业绩。 以下是该程序的核心功能说明&#xff1a; 任务管理模块&#xff1a;允许管理员创建、分配和管理地推任务。管理员能够精确地指派任务给…

java返回文件时为图片或pdf等设置在线预览或下载

设置Content-Disposition响应头类型 "inline"查看预览 &#xff1b; "attachment"下载&#xff1b; inline&#xff1a;表示回复中的消息体会以页面的一部分或者整个页面的形式展示 attchment&#xff1a;以附件形式被下载到本地&#xff1b;/*** 文件或图…

[Android自定义View]实现一个环形进度条控件

[Android View]实现一个环形进度条 导言 之前的文章里我们已经介绍了自定义View相关的知识了&#xff0c;本篇文章我们就来实战一下&#xff0c;从零到一&#xff0c;实现一个环形进度条的控件。 具体实现 大体框架 我们说过&#xff0c;如果要实现一个自定义控件的话一般有…

JavaScript系列——Promise

文章目录 概要Promise三种状态状态改变Promise链式调用Promise处理并发promise.all()promise.allSettled&#xff08;&#xff09;Promise.any()promise.race() 小结 概要 Promise中文翻译过来就是承诺、预示、有可能的意思。 在JavaScript里面&#xff0c;Promise 是一个对象…

是什么因素让 PLC 比单片机更可靠?单片机为何不能做到这些?

PLC&#xff08;可编程逻辑控制器&#xff09;和单片机&#xff08;微控制器&#xff09;在工业控制和自动化领域中都扮演着重要的角色&#xff0c;但它们在设计、性能和应用方面有显著的不同&#xff0c;这些差异导致PLC在某些方面比单片机更可靠&#xff1a; 环境适应性和耐用…

C语言课程设计之好友通讯录系统项目实现

好友通讯录系统项目实现 程序使用软件visual Studio 2022&#xff1b; 文章目录 好友通讯录系统项目实现题目描述分析与设计代码实现 题目描述 建立一个通讯录&#xff0c;可以对通讯录中的好友信息进行增加、删除、修改、查找以及对通讯录中的好友信息进行显示打印&#xff0…