【数据结构】八大排序之简单选择排序算法

🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境:Visual Studio 2022


目录

一.简单选择排序简介及思路

二.简单选择排序的代码实现

三.简单选择排序的优化

四.简单选择排序的时间复杂度分析

结语


一.简单选择排序简介及思路

简单选择排序算法(Simple Selection Sort)是一种简单直观的选择排序算法.

它的基本操作是:

  • 每一次通过n-i次关键字间的比较,从n-i+1个数据中选出关键字最小(大)的数据,并和第i(1≤i≤n)个数据交换
  • 重复n-1次上述操作,直到全部待排序的数据元素排完.

算法动图演示如下:


二.简单选择排序的代码实现

算法实现步骤:(以升序为例)

  1. 在元素集合arr[i]~arr[n-1]中选择关键码最小(大)的数据元素.
  2. 若它不是这组元素中的第一个(最后一个)元素,则将它与这组元素中的第一个(最后一个)元素交换.
  3. 在剩余的arr[i+1]~arr[n-1](arr[i]~arr[n-2])集合中,重复上述步骤,直到集合剩余一个元素.

清楚了实现步骤后,代码的实现就比较简单了,代码如下:

//交换函数
void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}//直接选则排序(升序
void SelectSort(int* a, int n)
{int left = 0;while (left < n - 1){int mini = left;for (int i = left + 1; i <= n - 1; i++){if (a[i] < a[mini]){mini = i;}}Swap(&a[left], &a[mini]);left++;}
}

三.简单选择排序的优化

我们在设计简单选择排序时,思路往往都是每趟循环选出一个最大最小的将其放在相应位置上,那么其实我们可不可以一趟直接将最大和最小的两个元素选出来呢?

依照这个思路,我们对简单选择排序进行优化,使其一趟就可以将最大的元素和最小的元素都选出来交换到相应的位置上,综上,代码实现如下:

//交换
void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}//选择排序(直接选择排序)
void SelectSort(int* a, int n)
{//优化:一趟选出最大和最小的int left = 0;int right = n - 1;while (left < right){int mini = left, maxi = left;for (int i = left + 1; i <= right; i++){if (a[i] < a[mini]){mini = i;}if (a[i] > a[maxi]){maxi = i;}}Swap(&a[left], &a[mini]);//如果left和maxi重叠,交换后需要修正一下再交换right和maxiif (left == maxi){maxi = mini;}Swap(&a[right], &a[maxi]);left++;right--;}
}

注意:

        当我们在一趟比较结束后选出mini和maxi并做交换的时候,要小心如果left记录的位置恰好存放的是maxi,则第一步交换left和mini后我们就要重新对maxi的位置做一个修正,如图:


四.简单选择排序的时间复杂度分析

我们可以发现,简单选择排序的特点是:

         元素挪动交换次数很少,但是元素比较次数很多,并且无论是数组天生顺序的情况还是天生逆序的情况,元素比较次数都是一样的,都是:T(n)=(n-1)+(n-2)+...+2+1=n(n-1) / 2 次.

          而对于交换次数而言,最好的时候,交换次数为0次,最坏的时候,交换次数为n-1次.

          基于最终的排序时间交换次数和比较次数的总和,因此,总的时间复杂度依然是O(n^2).


结语

希望这篇简单选择排序算法详解能对大家有所帮助,欢迎大佬们留言或私信与我交流.

有关更多排序相关知识可以移步:

【数据结构】八大排序算法​icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/135038495?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135038495%22%2C%22source%22%3A%22weixin_72357342%22%7D&fromshare=blogdetail

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【数据结构】八大排序之冒泡排序算法

【数据结构】八大排序之希尔排序算法

【数据结构】八大排序之直接插入排序算法


数据结构排序算法篇思维导图:

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

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

相关文章

Koa.js 入门手册:洋葱模型插件机制详解以及常用中间件

前言 Nodejs 提供了 http 能力&#xff0c;我们通过如下代码可以快速创建一个http server服务 const http require(http);http.createServer((req, res) > {res.write(hello\n);res.end();}).listen(3000);使用nodejs提供的原生能力启动一个http server并不麻烦&#xff…

css 2D转换

转换&#xff08;transorm&#xff09;是css3中具有颠覆性的特征之一&#xff0c;可以实现元素的位移、旋转、缩放等效果。 1.移动&#xff1a;translate 语法&#xff1a; transform:translate(x,y)或者分开写 transform:translateX&#xff08;n&#xff09; ​transform:t…

【合并两个pandas的DataFrame】

如果你想合并两个pandas DataFrame&#xff0c;可以使用concat、merge或join函数。 1、 使用concat函数: 这个函数用于沿着一条轴将多个对象堆叠到一起。 import pandas as pd # 创建两个示例的DataFrame df1 pd.DataFrame({A: [1, 2], B: [3, 4]}) df2 pd.DataFrame({A: […

界面控件DevExpress WPF Dock组件,轻松创建类Visual Studio窗口界面!

本文主要为大家介绍DevExpress WPF控件中的Dock组件&#xff0c;它能帮助用户轻松创还能受Microsoft Visual Studio启发的Dock窗口界面。 P.S&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress …

Python入门必看的关键字教程,清晰易懂

文章目录 前言FalseNoneTrueand,orasassertbreak与continueclassdefdelif,elif,elsetry,except,finally,raisefor,in,whileimport,fromglobalislambdanonlocalnotpassreturnwithyield、async 与 awaitPython技术资源分享1、Python所有方向的学习路线2、学习软件3、入门学习视频…

SpringBoot监听器

在Spring Boot中&#xff0c;你可以使用监听器来响应特定的事件。这些事件可以是Spring Boot应用生命周期中的某个阶段&#xff08;如启动、关闭等&#xff09;&#xff0c;也可以是你自定义的业务事件。 1. 创建一个监听器 创建一个监听器有两种方法&#xff1a;实现Applica…

每天五分钟计算机视觉:谷歌的Inception模块的计算成本的问题

计算成本 Inception 层还有一个问题,就是计算成本的问题,我们来看一下55 过滤器在该模块中的计算成本。 原始图片为28*28*192经过32个5*5的过滤操作,它的计算成本为: 我们输出28*28*32个数字,对于输出的每个数字来说,你都需要执行 55192 (5*5为卷积核的大小,192为通道…

如何通过EventChannel实现Flutter与原生平台之间的双向通信

本文将介绍如何通过EventChannel实现Flutter与原生平台之间的双向通信。如果想了解如何通过MethodChannel实现Flutter调用Android原生平台的方法,可以参考上篇文章。 Flutter如何实现与Android底层平台通信,调用底层Android原生方法https://sgknight.blog.csdn.net/article/…

威雅学校快讯:携手未来,同梦而行,威雅学校喜迎英国姐妹校管理团队访校视察

威雅学校喜迎英国姐妹校访校团 Visit from our sister school in the UK 英国威科姆阿贝学校 威雅学校大家庭 WAS Family 常州威雅WASCZ 香港威雅WASHK 杭州威雅WASHZ 南京威雅WASNJ 向春而行&#xff0c;卓越可期。日前&#xff0c;四所威雅学校均先后迎来了英国姐妹学校W…

人工智能辅助下的人工心脏:未来医疗的奇迹

导言 人工智能在医学领域的应用不断创新&#xff0c;其中人工心脏作为医疗工程的重要方向&#xff0c;将为心血管疾病患者带来新的治疗可能性。本文将深入研究人工智能辅助下的人工心脏技术&#xff0c;其原理、应用以及对未来医疗的影响&#xff0c;探讨人工心脏的发展历程、面…

vue看板使用电子数字

1、下载字体 https://www.dafont.com/theme.php?cat302&text0123456789 2、下载后将压缩包解压,并上传到https://link.csdn.net/?targethttps%3A%2F%2Fwww.fontsquirrel.com%2Ftools%2Fwebfont-generator 然后下载 3、项目中使用 在Vue项目中的assets中新建fonts文件夹…

QEMU源码全解析 —— virtio(15)

接前一篇文章&#xff1a; 上一回讲解了virtio_pci_device_plugged函数的前两部分&#xff0c;本回继续讲解virtio_pci_device_plugged函数的其余部分。为了便于理解&#xff0c;再次贴出virtio_pci_device_plugged函数源码&#xff0c;在hw/virtio/virtio-pci.c中&#xff0c;…

Java_正则表达式

正则表达式 接下来&#xff0c;我们学习一个全新的知识&#xff0c;叫做正则表达式。正则表达式其实是由一些特殊的符号组成的&#xff0c;它代表的是某种规则。 正则表达式的作用1&#xff1a;用来校验字符串数据是否合法 正则表达式的作用2&#xff1a;可以从一段文本中查找…

【PHP入门】1.3-数据类型、转换、判断

-数据类型- 数据类型&#xff1a;data type&#xff0c;在 PHP中指的是存储的数据本身的类型&#xff0c;而不是变量的类型。 PHP是一种弱类型语言&#xff0c;变量本身没有数据类型。 1.3.1PHP的八种数据类型 在PHP中将数据分为三大类八小类&#xff1a; 简单&#xff0…

Android EditText 自动换行

/1、在 XML 布局文件中设置 EditText 的属性&#xff1a; <EditTextandroid:layout_width"match_parent"android:layout_height"wrap_content"android:maxLines"10" <!-- 设置最大行数 -->android:inputType"textMultiLine"…

什么是 DDoS ?如何识别DDoS?怎么应对DDOS攻击

什么是DDOS攻击 DDoS攻击&#xff08;Distributed Denial of Service Attack&#xff09;即分布式拒绝服务攻击&#xff0c;是一种利用分布式网络来发起大量的请求&#xff0c;占用目标服务器或网络资源的攻击行为。这种攻击方式可以瘫痪目标系统&#xff0c;导致其无法正常提供…

JSON Ajax

1. JSON概念 JSON&#xff0c;全称JavaScript Object Notation&#xff0c;即JavaScript对象表示法&#xff0c;是一种轻量级的数据交换格式。它基于JavaScript的子集&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。 JSON的诞生&#xff0c;是为了解决电…

openssl生成https

安装 openssl wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz tar -xzvf openssl-1.1.1g.tar.gz cd openssl-1.1.1g/ ./config make sudo make install 软连接 ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1 ln -s /usr/local/lib64/libcrypt…

Linux---Ubuntu软件卸载

1. 软件卸载的介绍 Ubuntu软件卸载有两种方式: 离线安装包的卸载(deb 文件格式卸载&#xff09;在线安装包的卸载(apt-get 方式卸载) 2. deb 文件格式卸载 命令格式: sudo dpkg –r 安装包名 -r 选项表示安装的卸载 dpkg 卸载效果图: 3. apt-get 方式卸载 命令格式: …

动态规划算法

文章目录 动态规划算法引子代码实现背包问题 动态规划算法 引子 背包问题&#xff1a;现有一个背包&#xff0c;容量为4磅。现有如下物品&#xff1a; 1、要求达到的目标为装入的背包的总价值最大&#xff0c;并且重量不超出 2、要求装入的物品不能重复 3.2、动态规划算法基…