【十大排序算法】----选择排序(详细图解分析+实现,小白一看就会)


目录

一:选择排序——原理

二:选择排序——分析

三:选择排序——实现

四:选择排序——优化

五:选择排序——效率


一:选择排序——原理

        选择排序的原理:通过遍历数组,选出该数组中较大的或者较小的,放在数组的起始位置,当遍历完整个数组时排序完成。

二:选择排序——分析

选择排序的核心就是:多趟选择

若以升序(从小到大)排序为例,假若有N个数。

  • 第一趟遍历的目的是找到整个序列中最小的值,找到之后将其与第一个数(动图中的第0个位置)交换,这样一来,在整个数组中第一个数就是最小的。
  • 第二趟遍历:目的是找到整个序列中次小的值,也就是(动图中第0个位置上的数不在变动,在剩下的 N-1 个数中选出最小的),找到之后将其与剩下的 N-1 个数的第一个数(动图中的第1个位置)交换,这样一来,在整个数组中第一个数(第0位置)就是最小的,第二个数(第1位置)就是次小的
  • ......

当经过 N-1 趟的遍历交换之后,该序列就实现的从小到大的排列了。

 动图如下:  

三:选择排序——实现

选择排序代码实现如下  

#include<stdio.h>void SelectSort1(int* a, int n)            // 传的参数是 整个数组 和 此数组的大小
{int begin = 0;while (begin < n)                       // 决定所遍历的趟数{int mini = begin;for (int i = begin; i < n; i++)     // 从begin位置开始遍历{if (a[mini] > a[i])            // 找到较小的值,标记一下{mini = i;}}// 交换较小的值                     // 遍历一趟之后,将较小的值与 ”第一个数“ 进行交换int tem = a[mini];a[mini] = a[begin];a[begin] = tem;begin++;                   // 决定下一次所遍历的起始位置:(第一趟是0,第二趟为1,....)}
}int main()
{int a[] = { 38,45,22,29,13,24,42 };int sz = sizeof(a) / sizeof(a[0]);         // 获取数组大小for (int i = 0; i < n; i++)                // 打印排序前的数组{printf("%d ", a[i]);}printf("\n");SelectSort1(a, sz);                        // 实现选择排序for (int i = 0; i < n; i++)                // 打印排序后的数组{printf("%d ", a[i]);}printf("\n");
}

四:选择排序——优化

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

选择排序代码优化实现如下 

#include<stdio.h>// 选择排序(优化)
void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;            // begin标记第0位置,end标记最后一个数的位置while (begin < end)                    // 决定所遍历的次数{int maxi = begin;                  // 较大数---maxi变量标记int mini = begin;                  // 较小数---mini变量标记for (int i = begin; i <= end; i++)    // 在 [begin,end] 这一区间进行遍历{if (a[i] > a[maxi])            // 遍历的数较大,maxi进行标记{maxi = i;}if (a[i] < a[mini])            // 遍历的数较小,mini进行标记{mini = i;}}Swap(&a[begin], &a[mini]);        // 较小的数与 ”第一个数“ 交换,把较小的数放到 ”第一个位置“if (begin == maxi)                // 若 ”第一个位置“ 是较大数的位置,防止这个位置被上一个交换所 ”赶跑“{maxi = mini;}Swap(&a[end], &a[maxi]);        // 较大的数与 ”最后一个数“ 交换,把较大的数放到 ”最后一个位置“ 上++begin;                        // 决定下一次遍历的区间--end;}}int main()
{int a[] = { 38,45,22,29,13,24,42 };int sz = sizeof(a) / sizeof(a[0]);         // 获取数组大小for (int i = 0; i < n; i++)                // 打印排序前的数组{printf("%d ", a[i]);}printf("\n");SelectSort(a, sz);                        // 实现选择排序for (int i = 0; i < n; i++)                // 打印排序后的数组{printf("%d ", a[i]);}printf("\n");
}

        时刻谨记:当一个数已经知道其是 最大/最小 ,并已经将其进行交换之后,那么这个位置是万万不可变动的。

五:选择排序——效率

时间复杂度:O(N^2)

空间复杂度:O(1)

选择排序是不稳定的排序。

选择排序是最简单的排序之一,最大的优点就是好理解,不过因为其效率低下,所以在一般情况下不使用。


        以上的内容若是对大家起到帮助的话,大家可以动动小手点赞,评论+收藏。大家的支持就是我进步路上的最大动力! 

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

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

相关文章

数据结构~~带环链表的环开始的节点位置**两种方法

1.带环链表环开始的位置 &#xff08;1&#xff09;上面的这个测试用例使用的是包含了4个节点的带环链表&#xff0c;我们要找的就是链表里面的环开始的节点的位置&#xff0c;拿这个测试用例而言&#xff0c;就是2这个节点&#xff0c;从这个节点开始&#xff0c;我们的链表就…

【数据结构】栈的实现(顺序栈)

文章目录 栈的概念和结构栈的实现1.顺序存储结构栈的定义初始化栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空&#xff0c;如果为空返回非零结果&#xff0c;如果不为空返回0销毁栈栈的打印 完整代码&#xff08;包括测试代码&#xff09;Stack.hStack.ctest.c 栈…

代码随想录Day 47|Leetcode|Python|392.判断子序列 ● 115.不同的子序列

392.判断子序列 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的…

可以当回音壁使用的蓝牙条形音箱中应用的蓝牙芯片

条形音箱&#xff08;英语&#xff1a;Soundbar&#xff09;是一个有立体声效的音箱&#xff0c;通常放置于屏幕的上方或下方&#xff0c;基于声学的考虑&#xff0c;此种音箱多为长条形设计&#xff0c;故名。无线蓝牙条形音箱也一样&#xff0c;银色磨砂铝合金中框。搭配黑色…

JavaScript基础知识强化:变量提升、作用域逻辑及TDZ的全面解析

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 ⭐️ 引言&#x1f3af; 变量提升(Hoisting)&#x1f47b; 暂时性死区&#xff08;Temporal Dead Zone, TDZ&#xff09;解释&#x1f4e6; var声明&#x1f512; let与const声明&#x1f4d6; 函数声明 与 函数表达式函数声…

“网络安全新纪元:等保2.0的详细解读与实践”

网络安全等级保护基本要求》&#xff08;等保2.0&#xff09;于2019年6月发布&#xff0c;是我国网络安全等级保护制度的一项重要标准。等保2.0主要针对关键信息基础设施的网络安全保护&#xff0c;对数据安全和个人信息保护提出了更高的要求。本文将对等保2.0进行详细解读&…

导电材料——分类、性能与应用

本篇为西安交通大学本科课程《电气材料基础》的笔记。 导电材料指的是能在电场下传导电流的材料。导体价电子所在能带为半满带&#xff0c;且相邻能级间隔小&#xff0c;外电场下电子很容易从低能级跃迁到高能级上&#xff0c;大量的电子很容易获得能量进行共有化运动&#xf…

队列的实现与OJ题目解析

"不是你变优秀了, 那个人就会喜欢你." 文章索引 前言1. 什么是队列2. 队列的实现3. OJ题目解析4. 总结 前言 感情可以培养是个伪命题. 如果有足够多的时间和爱, 就可以让另一个人爱上你的话, 那谁和谁都可以相爱了. 爱情之所以会让人死去活来, 是因为, 答案都写在了…

Skywalking 介绍及应用(从0到1)完整版

微服务全链路追踪 一、APM 系统 APM 系统是可以帮助理解系统行为、用于分析性能问题的工具以便发生故障的时候&#xff0c;能够快速走位和解决问题。 告警规则 SkyWalking 的发行版都会默认提供config/alarm-settings.yml文件&#xff0c;里面预先定义了一些常用的告警规则。…

海外静态IP:全球互联的稳定之选

在全球化的商业环境中&#xff0c;企业与个人对于网络的依赖日益加深&#xff0c;而一个稳定、可靠的海外静态IP成为了连接世界的关键。本文将从五个方面深入探讨海外静态IP的重要性、应用场景、技术优势、市场趋势以及选择时的考量因素。 一、海外静态IP的重要性 静态IP地址是…

DC-DC直流升压线性可调电源模块电压控制输出0-50V/0-80V/0-100V/0-200V/0-250V/0-300V/0-500V/0-1000V

特点 效率高达 75%以上1*2英寸标准封装单电压输出可直接焊在PCB 上工作温度: -40℃~75℃阻燃封装&#xff0c;满足UL94-V0 要求温度特性好电压控制输出,输出电压随控制电压线性变化 应用 GRB 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&#xff1a;4.5~9V、…

sentinel搭建及使用

1.添加依赖&#xff08;版本可依赖于父pom&#xff09; SentinalResource注解&#xff1a; 添加依赖&#xff1a; blockhandler: fallback: