排序算法介绍(三)选择排序

0. 简介

        选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。


1. 选择排序的实现

选择排序的基本思想:

  1. 在未排序的序列中找到最小(或最大)的元素,存放到排序序列的起始位置。
  2. 再从剩余未排序的元素中继续寻找最小(或最大)的元素,然后放到已排序的序列的末尾。
  3. 以此类推,直到所有元素均排序完毕。

选择排序过程演示:

c1ebf29cabe543548493dcf5dc6e6164.gif

 


2. 选择排序时空间复杂度分析

选择排序的时间复杂度和空间复杂度如下:

  1. 时间复杂度:

    • 无论数据状况如何,选择排序都需要进行 n-1 趟选择,每趟选择都需要进行 n-i 次比较(i 是当前趟数),所以总的时间复杂度是 O(n^2)。
  2. 空间复杂度:

    • 选择排序是原地排序,只需要一个额外空间用于临时交换元素,所以空间复杂度是 O(1)。

总结:选择排序的时间复杂度是 O(n^2),空间复杂度是 O(1)。


3. 选择排序C语言代码

C代码实现:

#include <stdio.h>  void selectionSort(int arr[], int n) {  int i, j, minIndex, temp;  for (i = 0; i < n-1; i++) {  // 外层循环控制选择的趟数  minIndex = i;            // 记录最小值的索引,初始化为当前趟的起始位置  for (j = i+1; j < n; j++) {  // 内层循环在未排序的元素中查找最小值  if (arr[j] < arr[minIndex]) {  minIndex = j;  // 更新最小值的索引  }  }  // 交换找到的最小值与当前趟的起始位置的值  temp = arr[minIndex];  arr[minIndex] = arr[i];  arr[i] = temp;  }  
}  int main() {  int arr[] = {64, 34, 25, 12, 22, 11, 90};  // 待排序的数组  int n = sizeof(arr)/sizeof(arr[0]);      // 数组的长度  selectionSort(arr, n);                   // 对数组进行选择排序  printf("Sorted array: \n");  for (int i=0; i < n; i++) {              // 输出排序后的数组  printf("%d ", arr[i]);  }  printf("\n");  return 0;  
}

代码解释:

  • selectionSort 函数接收一个整数数组和它的长度作为参数。
  • 外层循环负责保证选择的趟数。例如,有7个数字,就需要选择6趟。
  • 内层循环负责在未排序的元素中查找最小值。minIndex 用于记录当前找到的最小值的索引,初始化为当前趟的起始位置。如果发现有更小的数,就更新 minIndex
  • 内层循环结束后,我们已经找到了当前未排序部分的最小值,然后将其与当前趟的起始位置的值进行交换。这样,当前趟的起始位置就有了正确的值。
  • 外层循环继续进行,直到所有元素都排好序。

4. 选择排序代码运行结果

代码运行结果:

ea1480431dc246e0a2003d41e45f2b2d.png

 

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

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

相关文章

超大规模集成电路设计----学习框架(一)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----数字集成电路——电路、系统与设计(第二版)及中国科学院段成华教授PPT 超大规模集成电路设计----学习框架&#xff08;一&#xff09; 这门课在学什么&#xff1f;这门课该怎么学&#xf…

PostgreSQL中常用的几种连接池总结及更新

前言 PostgreSQL的多进程结构&#xff0c;使得在支持大规模连接的时候&#xff0c;服务器端显得比较吃亏。一般上了1000个连接以上的时候&#xff0c;系统就会受到很大影响。这个时候&#xff0c;使用连接池&#xff0c;优势就会突显出来了。 在云环境下&#xff0c;一个JAVA…

Redis quicklist源码+listpack源码(5.0版本以上的优化)

ziplist设计上的问题&#xff0c;每一次增删改都需要计算前面元素的空间和长度&#xff08;prevlen&#xff09;&#xff0c;这种设计缺陷非常明显&#xff0c;因此引入了quicklist的设计。 quicklist quicklist实际就是双端链表&#xff0c;链表里的每一个节点都是ziplist&a…

Python---函数递归---练习:猴子吃桃问题(本文以递归算法 解法为主)

相关链接&#xff1a;Python---函数递归---练习&#xff1a;斐波那契数列&#xff08;本文以递归算法为主&#xff09;-CSDN博客 案例&#xff1a;猴子吃桃问题 猴子吃桃问题。猴子第1天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个。…

类和对象——(5)定义对象数组

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 芳华没有草稿纸&#xff0c;我们永久不…

曲线积分和路径无关条件和应用

文章目录 平面上曲线积分和路径无关条件曲线积分与路径无关的定义等价描述小结充要条件定理充分性必要性 说明 线积分与路径无关时的计算&#x1f47a;曲线积分与路径无关的三个等价命题等价结论 Newton-Leibniz二元函数形式积分路径的简化 应用例例 平面上曲线积分和路径无关条…

UVa1584环状序列题解

题目 长度为n的环状串有n种表示方法&#xff0c;分别为从某个位置开始顺时针得到&#xff0c;在这些排列中字典顺序最小的称“最小表示”。 如CTCC的最小表示为CCCT&#xff0c;CGAGTCAGCT的最小表示为AGCTCGAGTC。 提示&#xff1a;对于两个字符串&#xff0c;从第一个字符开始…

openEuler学习05-ssh升级到openssh-9.5p1

openEuler的版本是openEuler 20.03&#xff0c;ssh的版本是OpenSSH_8.2p1 [roottest ~]# more /etc/os-release NAME"openEuler" VERSION"20.03 (LTS-SP3)" ID"openEuler" VERSION_ID"20.03" PRETTY_NAME"openEuler 20.03 (LTS-…

【Google2023】利用TiDE进行长期预测实战(时间序列密集编码器)

一、本文介绍 大家好&#xff0c;最近在搞论文所以在研究各种论文的思想&#xff0c;这篇文章给大家带来的是TiDE模型由Goggle在2023.8年发布&#xff0c;其主要的核心思想是&#xff1a;基于多层感知机&#xff08;MLP&#xff09;构建的编码器-解码器架构&#xff0c;核心创…

Python---函数递归---练习:斐波那契数列(本文以递归算法为主)

编程思想&#xff1a; 如何利用数学模型&#xff0c;来解决对应的需求问题&#xff1b;然后利用代码实现对应的数据模型。 算法&#xff1a;使用代码实现对应的数学模型&#xff0c;从而解决对应的业务问题 程序 算法 数据结构 在经常使用的算法中&#xff0c;有两种非常…

RC低通滤波电路直接带载后会发生什么?

1、滤波的含义 滤波是频域范畴&#xff0c;它说的是不同频率的信号经过一个电路处理后&#xff0c;信号发生变化的问题&#xff0c;变化包含了原始信号幅值和相位的变化&#xff0c;滤波电路对信号的幅值做出的响应称为幅频响应&#xff0c;对信号相位做出的反应称为相频响应。…

设计模式---第五篇

系列文章目录 文章目录 系列文章目录前言一、知道观察者模式吗?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、知道观察者模式吗? 答:观察者模式是定义对…

逸学java【初级菜鸟篇】12.网络通讯编程

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 目标&#xff08;任务驱动&#xff09; 请练掌网络通讯的内容。 局域网和互联网 局域网英文&#xff1a;Local Area Network&#xff0c;缩写&#xff1a;LAN&#xff0c;是指一群通过一定形式连接起来的计算机&#xff0c;…

Java封装讯飞星火大模型历险记

问题描述与分析 现状描述与目标 在使用讯飞星火大模型API的过程中&#xff0c;API的返回结果在可以在其他线程中进行分次打印&#xff0c;但是在main方法中直接打印返回结果&#xff0c;显示为空。这种情况下不利于二次封装&#xff0c;希望在main方法中获取完整的API返回结果…

Linux——基本指令(一)

写在前面&#xff1a; 我们云服务器搭建的Linux系统&#xff0c;使用的镜像版本CentOS 7.6,使用的Xshell远程连接云服务器 前面我们使用超级管理员root账号登录&#xff0c;一般我们使用普通用户登录&#xff0c;那么如何创建新用户呢&#xff1f; 1.创建新用户 &#xff08…

Ubuntu22.04无需命令行安装中文输入法

概要&#xff1a;Ubuntu22.04安装完成后&#xff0c;只需在设置中点点点即可完成中文输入法的安装&#xff0c;无需命令行。 一、安装中文语言包 1、点击屏幕右上角&#xff0c;如下图所示。 2、点击设置 3、选择地区与语言&#xff0c;点击管理已安装的语言 4、点击安装 5、输…

KALI LINUX附录

预计更新 第一章 入门 1.1 什么是Kali Linux&#xff1f; 1.2 安装Kali Linux 1.3 Kali Linux桌面环境介绍 1.4 基本命令和工具 第二章 信息收集 1.1 网络扫描 1.2 端口扫描 1.3 漏洞扫描 1.4 社交工程学 第三章 攻击和渗透测试 1.1 密码破解 1.2 暴力破解 1.3 漏洞利用 1.4 …

docker: Error response from daemon: network hm-net not found.

在使用Docker部署RabbitMQ的时候出现错误&#xff1a;docker: Error response from daemon: network hm-net not found. docker run \-e RABBITMQ_DEFAULT_USERuser \-e RABBITMQ_DEFAULT_PASS123456 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5…

java对象的创建过程是怎样的?

Java对象的创建过程主要分为五个步骤&#xff1a; 1. 加载类信息&#xff1a;当我们使用new关键字来创建一个对象时&#xff0c;首先会去检查这个类的信息是否已经被加载到内存中。如果没有加载&#xff0c;就会先加载。 2. 分配内存空间&#xff1a;在JVM的堆内存中为新的对…

ElasticSearch之Analyze index disk usage API

本API用于分析、统计指定index当前占用的存储空间。 考虑到本特性目前仍然处于预览状态&#xff0c;因此使用方法、参数等可能会发生变化&#xff0c;或者未来也许会被删除。 本API暂时不建议在生产系统中使用。 命令样例如下&#xff1a; curl -X POST "https://localh…