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

news2024/11/27 6:31:31

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.coloradmin.cn/o/1291738.html

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

相关文章

Java:CAS(乐观锁)

目录 1. 什么是CAS机制 2. CAS的缺点 synchronized是悲观锁&#xff0c;这种线程一旦得到锁&#xff0c;其他需要锁的线程就挂起的情况就是悲观锁。CAS操作的就是乐观锁&#xff0c;每次不加锁而是假设没有冲突而去完成某项操作&#xff0c;如果因为冲突失败就重试&#xff0…

Linux中的日志管理

本章主要介绍Linux中的日志管理 了解rsyslog是如何管理日志的查看日志的方法 日志中记录了各种各样的问题&#xff0c;所以读取日志是检测并排除故障的一个重要方式&#xff0c;日志文件默认放在/var/log目录下。不同的问题要读取不同的日志&#xff0c;例如&#xff0c;邮件…

Python 在控制台打印带颜色的信息

#格式&#xff1a;  设置颜色开始 &#xff1a;\033[显示方式;前景色;背景色m #说明&#xff1a; 前景色 背景色 颜色 --------------------------------------- 30 40 黑色 31 41 红色 32 …

Java 对接智谱 AI(官方 sdk 是真垃圾)

官方 sdk 狗屎。 一堆密钥不知道啥玩意&#xff0c;文档也没写好。 python 版本的就不清楚&#xff0c;应该支持会比较好&#xff0c;果然做 ai 应用后端开发还是得使用 python 比较好。 那么要如何对接智谱 AI 呢&#xff1f;用小博哥的这个版本&#xff0c;虽然不是官方的…

UVM验证平台中加入sequencer

sequence机制用于产生激励&#xff0c;它是UVM中最重要的机制之一。在 一个规范化的UVM验证平台中&#xff0c;driver只负责驱动transaction&#xff0c;而不负责产生transaction。sequence机制有两大组成部分&#xff0c;一是 sequence&#xff0c;二是sequencer。如何在验证平…

安防监控系统镜头选型分析,低噪声,低振动,多通道

安防镜头步进驱动选用型号 GC6107 C6109 GC6209 GC6119 GC6129 GC6139 GC6208 GC6150 GC6151 GC6152 GC6125 GC6236采用5V的镜头驱动 。其中GC6107 C6109 GC6209 GC6119 GC6129 GC6139 GC6208关键特性两通道&#xff0c;256细分&#xff0c;低噪&#xff0c;内部和外部时钟…

React 中虚拟DOM是什么,为什么需要它?

注意&#xff1a;本节主要讲React中的虚拟DOM&#xff0c;但是虚拟DOM并不是React中特有的内容。 1. React 中虚拟 DOM是什么&#xff1f; 虚拟DOM是对真实DOM的描述&#xff0c;虚拟DOM是JS对象&#xff0c;实际上就是 JSX 通过 babel 转换成 React.createElement()&#xff…

浴霸市场研究:2023年市场现状及未来发展

据不完全统计&#xff0c;目前我国浴霸行业拥有品牌数量超过250个&#xff0c;市场竞争激烈&#xff0c;主要代表企业有奥普、美的、松桥、松下、澳柯玛、光芒、桑普、来斯奥、飞雕、万家乐等。从未来发展趋势来看&#xff0c;伴随着市场消费升级以及市场需求多元化发展&#x…

道可云专业文旅元宇宙平台整体解决方案,打造沉浸体验新场景

值得注意的是&#xff0c;随着“互联网”时代的到来&#xff0c;元宇宙技术正逐渐成为未来数字经济核心之一。《“十四五”数字经济发展规划》将互联网新基建、数字产业生态系统、数字文娱与数字创新产业视为重点发展领域&#xff0c;其中元宇宙技术在文旅等旅游发挥了不可替代…

【linux系统编程】编辑器gcc/g++

目录 Linux下的编辑器 介绍&#xff1a; 1&#xff0c;编辑器gcc/g 1-1&#xff0c;系统的编译过程 1-2&#xff0c;预处理过程 1-3&#xff0c;编译过程 1-4&#xff0c;汇编过程 1-5&#xff0c;链接过程 Linux下的编辑器 介绍&#xff1a; Linux系统下可支持很多高…

性能优化三步骤(一)——性能分析

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、性能分析简介 在完成性能测试之后&#xff0c;需要输出一份性能测试报告&#xff0c;分析系统性能测试的情况。其中测试结果需要包含测试接口的…

Google上架踩坑(最新)

1、目标版本需要大于33 2、平台要求版本>33还需要勾选IDFA广告标识&#xff0c;所以这个也不能忘了 3、打包需要打aab渠道包 4、上传安装包提交之后&#xff0c;如果有报错&#xff0c;再打包需要升版本&#xff0c;不然还会报错 5、2023年11月13号谷歌发的新规定&…

亚马逊自养号测评和真人测评的区别,优劣剖析

大家都知道亚马逊的review对产品listing曝光和流量是有很大影响&#xff0c;但是亚马逊的review又不是那么容易获取的&#xff0c;再加上亚马逊平台风控的不断严苛&#xff0c;所以卖家们想尽办法打造爆款listing是每个亚马逊卖家共同的目标&#xff0c;尤其是当旺季到来时&…

记账中心二开

系统预设了 这几种 FSubSystem 为子系统 T_VC_SubSystem 卡片显示的表 字段 FNeedRalteAccount 设置为1的话 &#xff0c;需要与总账连用系统将去查找 系统状态控制表。 如果系统状态 没有配置这个子系统 将无法显示数据 select sysStaCtr.fid from T_BD_SystemStatusCt…

销售技巧培训之如何提升销售沟通技巧

销售技巧培训之如何提升销售沟通技巧 现在市场环境竞争越来越激烈&#xff0c;产品越来越过剩&#xff0c;如何把产品卖出去是摆在企业面前的难题。所以打造一致所向披靡的销售团队&#xff0c;提升销售人员的系统化销售能力就显得非常重要。在销售系统培训模块中&#xff0c;…

圆通单号查询,圆通速递物流查询,对需要的单号进行颜色标记

批量查询圆通速递单号的物流信息&#xff0c;并对需要的单号进行颜色标记。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&#xff0c…

Pandas教程09:DataFrame数据可视化绘制折线图、柱状图、散点图、直方图等

pandas.plot() 是 pandas 库中的一个非常方便的函数&#xff0c;用于绘制各种图形&#xff0c;例如线图、柱状图、散点图等。以下是一些示例用法&#xff1a; 1.绘制一个简单的线图&#xff1a; # Author : 小红牛 # 微信公众号&#xff1a;wdPython import pandas as pd impo…

Kali Linux 2023.4 已经发布了!

开发人员推出了 Kali Linux 2023.4&#xff0c;这是2023 年发行版的第四个也是最后一个版本。 新产品已经可供下载&#xff0c;包含15 个新工具和 GNOME 45。 Offective Security 团队报告称&#xff0c;在今年的最终版本中&#xff0c;操作系统中并没有添加太多新功能&…

【三维重建】多频外差相位展开(C++实现)

在结构光三维重建中&#xff0c;通过相移法求解出来的相位是包裹相位&#xff08;在 [&#xff0d;π/2,π/2] 间成周期性 &#xff09; 我们想要用相位找到相机与投影仪间的对应像素&#xff0c;就需要进行相位展开&#xff0c;确保每一行的相位值是唯一的。 多频外差是相位…

新版idea创建maven项目时的下载问题

新版idea创建时没有一个直接的maven选项 而是一个Maven Archetype选项&#xff0c;我们只需要选择它也是一样的&#xff0c;后面跟着选就行 配置国内下载源的方法如下&#xff1a; 1. 2. 3. 代码&#xff1a; <mirror> <id>alimaven</id> <name>al…