【C++】选择排序

简介: 【C++】选择排序

在这里插入图片描述

前言:
✌ 作者简介:游坦之 ✌
🏆 大学软件工程在读,希望学到真本领,经世致用 🏆
📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
💬 人生格言:成好人,行好事,做儒猿💬
🔥 如果感觉博主的文章还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦
在这里插入图片描述

🍸选择排序

🍖什么是选择排序

​ 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

🍳举个栗子

对{29,10,14,8,8,20}进行选择排序,执行顺序如下:

在这里插入图片描述

首先需要设置两个变量,第一个变量,index初始值为0,代表已经排好多少个元素,第二个变量temp,代表当前最小(大)的值。

第一趟temp设置为i,经过一趟的比较,找到最小的值为8,与index下的数进行交换,此时序列{8,10 14,29,8,20},index更新为1;

第二趟重复上述过程,找到最小的值为8,与index下的数据进行交换,此时序列{8,8,14,29,10,20},index更新为2;

第三趟重复上述过程,找到最小的值为10,与index下的数据进行交换,此时序列{8,8,10,29,14,20},index更新为3;

第四趟重复上述过程,找到最小的值为14,与index下的数据进行交换,此时序列{8,8,10,14,29,20},index更新为4;

第五趟重复上述过程,找到最小的值为20,与index下的数据进行交换,此时序列{8,8,10,14,10,19},index更新为5;

index = n-1(n为待排序元素的个数);排序完成。

🥩伪代码

for(int i=0;i<n;i++)
{
    int temp = i;
    for(int j = index;j<n;j++)
    {
        if(a[temp]>a[j])
        {
            temp = j;
        }
    }
    swap(a[temp],a[i]);
    index++;
}

🍃见解

​ 选择排序的核心思想即是在一个范围里(为排序的)找出最小或者最大的值,与范围的起始值进行交换,进行n-1躺,从而排序完整个集合。

​ 选择排序的时间复杂度:由于需要排序n-1躺,每一趟又需要遍历m个元素,所以选择排序的时间复杂度即为O(n2)。

​ 比赛时,只能适合10000以内的数据,如果超出了这个数据,很可能会超时。

​ 这里有一个技巧,就是在比赛的时候,可以避免使用cin、cout,而使用c语言中的printf、scanf,后者是比前者快很多的,当然前者也可以通过其他代码进行优化,但如果记不住,可以直接用C语言的输入输出,以提高通告的概率。

​ 什么叫算法的稳定性:算法稳定性指的是在一组待排序记录中,如果存在任意两个相等的记录R和S,且在待排序记录中R在S前,如果在排序后R依然在S前,即它们的前后位置在排序前后不发生改变,则称为排序算法为稳定的。

​ 为什么选择排序是不稳定的?举个特例{10,8,10,4},这四个值第一个10我们标记为A10,第二个10我们标记为B20,在第一次排序过程后序列变为{4,8,10,10},A10去了B10后面,和原来的相对位置不一样了,所以选择排序是不稳定的。

🥗牛刀小试

对{5,10,20,48,29,10}进行排序

#include <iostream>
using namespace std;
int n;
int a[10010];
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    int index = 0;
    for(int i=0; i<n;i++)
    {
        int temp = i;
        for(int j=index;j<n;j++)
        {
            if(a[temp]>a[j])
            {
                temp = j;
            }
        }
        swap(a[temp],a[i]);
        index++;
        if(index==n)
        {
            break;
        }
    }
    for(int i=0;i<n;i++)
    {
        cout<<a[i]<<" ";  
    }
    return 0;
}

效果图:

(C:\Users\86158\AppData\Roaming\Typora\typora-user-images\image-20220805185659361.png)]

✨$\textcolor{blue}{原创不易,还希望各位大佬支持一下}$ <br/>
👍 $\textcolor{green}{点赞,你的认可是我创作的动力!}$ <br/>
⭐️ $\textcolor{green}{收藏,你的青睐是我努力的方向!}$ <br/>
✏️ $\textcolor{green}{评论,你的意见是我进步的财富!}$ <br/>

在这里插入图片描述

相关文章
|
C++
在C++语言中比较两个数的大小的方法
在C++语言中比较两个数的大小的方法
2803 1
|
安全 Java 数据库
后端进阶之路——万字总结Spring Security与数据库集成实践(五)
后端进阶之路——万字总结Spring Security与数据库集成实践(五)
|
12月前
|
API 开发者 UED
自学记录鸿蒙API 13:PreviewKit从文件预览到应用开发
通过学习API 13,我深入研究了**PreviewKit(文件预览服务)**。该模块支持快速预览多种文件类型(文本、图片、视频、音频、PDF等),为文件管理类应用提供系统级支持。本文分享了从搭建开发环境到实现单文件和多文件预览的全过程,并介绍了如何构建一个实用的文件预览助手应用。通过实践,不仅掌握了技术细节,还提升了个人开发能力。希望这些经验能为其他开发者带来启发与帮助。
296 10
自学记录鸿蒙API 13:PreviewKit从文件预览到应用开发
|
5月前
|
算法 搜索推荐
选择排序的实现思路
该内容描述了选择排序算法的基本思想:将数组分为“未排序”和“已排序”两部分,每轮从“未排序”中选出最大元素放到“已排序”中,重复此过程直至“未排序”只剩一个元素,排序结束。
100 1
|
架构师 关系型数据库 MySQL
MySQL最左前缀优化原则:深入解析与实战应用
【10月更文挑战第12天】在数据库架构设计与优化中,索引的使用是提升查询性能的关键手段之一。其中,MySQL的最左前缀优化原则(Leftmost Prefix Principle)是复合索引(Composite Index)应用中的核心策略。作为资深架构师,深入理解并掌握这一原则,对于平衡数据库性能与维护成本至关重要。本文将详细解读最左前缀优化原则的功能特点、业务场景、优缺点、底层原理,并通过Java示例展示其实现方式。
508 1
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
2986 0
高精度算法(加、减、乘、除,使用c++实现)
|
关系型数据库 MySQL 程序员
Docker swarm 架构介绍|学习笔记
快速学习 Docker swarm 架构介绍
Docker swarm 架构介绍|学习笔记
|
存储 关系型数据库 MySQL
PostgreSQL与MySQL优劣势比较浅谈
PostgreSQL与MySQL优劣势比较浅谈
2378 0
|
Linux 网络安全 数据安全/隐私保护
【最新教程】树莓派安装系统及VNC远程桌面连接
【最新教程】树莓派安装系统及VNC远程桌面连接
|
API 数据安全/隐私保护 Python
Python中使用`requests`库进行身份验证与授权
【4月更文挑战第12天】在Python的网络编程中,许多API和Web服务要求用户进行身份验证和授权,以确保只有经过认证的用户才能访问特定的资源或执行特定的操作。`requests`库作为Python中流行的HTTP客户端库,提供了灵活且强大的身份验证和授权机制。本文将详细介绍如何在Python中使用`requests`库进行身份验证与授权。
1151 0