排序(2)——选择排序

三、选择排序

1.简介

        选择排序主要采取的排序策略就是选择,在拿到待排序数组后,程序会一遍遍地遍历未排序部分数组,在每一次的遍历过程中会找到最小的元素,并在遍历完成后换到未排序数组部分的最左侧。如此循环往复,每一次遍历选出一个最小的数据进行排序,最后达到整个数组有序。

         选择排序思想方法很简单,就是比较找到最小,然后交换,一次排好一个元素。我们也可以将选择排序做一些优化,比如每次选出一个最大的和一个最小的,分别排在左端和右端,这样排序是从两端同时开始,效率加倍。本文的选择排序就采取这种方法,一次遍历选出最大值和最小值。

2.思路与代码

        在写选择排序的时候,我们同样试着将单步的排序写出来,再加上循环生成最后的选择排序。

        假设此时区间[begin,end]需要排序,那么我们就需要对该区间进行遍历,找到最大值与最小值的下标(因为数组交换需要通过下标实现)。我们可以认为最小值和最大值下标分别为begin和end,当找到更小或更大的元素时修改变量赋值即可。在遍历结束后,将最小值与下标为begin的值交换,将最大值与下标为end的值交换。

        注意!此处可能存在如下情况:

        发生这种错误是因为最大值落在了begin位置,导致最小值交换之后maxi未进行更新,使得maxi指向的位置不再是最大值,而变成了新换过来的最小值。解决这个问题并不难,加个判断即可。于是我们可以得到单步排序代码。 

    int begin,end;int maxi = end, mini = begin;for (int i = begin; i <= end; i++){if (a[i] > a[maxi]){maxi = i;}if (a[i] < a[mini]){mini = i;}}swap(&a[mini], &a[begin]);if (maxi == begin){maxi = mini;}swap(&a[maxi], &a[end]);

        有现在的基础,再写出选择排序就不是什么难事了。我们只需要让begin与end分别从头和尾开始,每次排序后begin自增、end自减即可。

void swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}
void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int maxi = end, mini = begin;for (int i = begin; i <= end; i++){if (a[i] > a[maxi]){maxi = i;}if (a[i] < a[mini]){mini = i;}}swap(&a[mini], &a[begin]);if (maxi == begin){maxi = mini;}swap(&a[maxi], &a[end]);begin++;end--;}
}

3.复杂度与稳定性分析

(1)时间复杂度

        选择排序的时间复杂度不难分析,无论数组的情况,都需要从头到尾慢慢遍历,是典型的等差数列,所以其时间复杂度是O(n^2)

(2)空间复杂度

        选择排序并未用到多余额外的空间,所以空间复杂度是O(1)

(3)稳定性

        选择排序是不稳定的。

        选择排序直观想象好像可以控制当a[i] == a[mini]时不改变mini,就可以成为稳定的。但是要敏锐地捕捉到其存在数据交换的情况,从而是有可能打乱相对顺序的。如:

        因而我们可以认为选择排序是不稳定的。 

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

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

相关文章

Linux网络编程——网络初识

文章目录 1. 网络协议初识1.1 为什么要有网络协议1.2 协议分层 2. OSI七层模型3. TCP/IP五层&#xff08;或四层&#xff09;模型4. 网络传输基本流程5. 以太网通信 1. 网络协议初识 1.1 为什么要有网络协议 早期计算机是独立的&#xff0c;如果要进行数据交互&#xff0c;就…

【Shell实战案例面试题】输入网卡的名字,来输出网卡的IP

1.问题 参数后判断要加"" 名字为空时显示ip 2.分析 把本机的所有网卡名列出来&#xff0c;来引导用户输入 使用命令列出所有网卡信:ifconfig/ip a 设计一个函数&#xff0c;把网卡名作为参数&#xff0c;函数返回网卡的IP 在获取某个网卡IP时&#xff0c;考虑网…

手把手带你Git入门,从下载到精通,常用git命令

文章目录 Git概述什么是GitGit历史Git是什么 为什么要使用Git什么是版本控制系统 Git和SVN对比SVN集中式SVN优缺点 Git分布式Git优缺点 Git工作流程四个工作区域工作流程 Git下载与安装下载window版下载64位软件包安装Git Git基础环境配置设置用户信息查看配置信息 文件的两种状…

Android Clear架构最强官方指南Kotlin版

Android Clear架构最强官方指南Kotlin版 在这篇文章中&#xff0c;我将介绍关于Android应用程序架构的一些内容。尽管自从早期更稳健的Android架构方法在移动开发中变得流行以来已经说了很多话&#xff0c;但改进和演进的空间总是存在的。 基于上述文章中的清晰架构示例&…

从大模型中蒸馏功能性重排列任务的先验知识

导读 本文是VCC朱家辉同学对论文 Distilling Functional Rearrangement Priors from Large Models 的解读&#xff0c;该工作来自北京大学和中山大学&#xff0c;并已被发表在国际机器人顶会ICRA 2024上。 项目主页&#xff1a; https://sites.google.com/view/lvdiffusion…

ChatGPT更新了Mention功能,集结若干GPTs作战,AI智能体的心智入口;向量数据库的挑战和未来

&#x1f989; AI新闻 &#x1f680; ChatGPT更新了Mention功能&#xff0c;集结若干GPTs作战&#xff0c;AI智能体的心智入口 摘要&#xff1a;OpenAI在ChatGPT中引入了一个新功能&#xff0c;允许用户在聊天时任意一个GPTs&#xff08;即ChatGPT最新推出的AI Agent 智能应用…

文心一言 VS 讯飞星火 VS chatgpt (189)-- 算法导论14.1 6题

六、用go语言&#xff0c;在OS-SELECT或OS-RANK中&#xff0c;注意到无论什么时候引用结点的size属性都是为了计算一个秩。相应地&#xff0c;假设每个结点都存储它在以自己为根的子树中的秩。试说明在插入和删除时&#xff0c;如何维护这个信息。(注意&#xff0c;这两种操作都…

UI设计中的图标定义

图标的含义 图标是图形化用户界面设计中的重要元素之一&#xff0c;也是图形化用户界面设计中最直接、最生动的视觉形态&#xff0c;有着优秀图形化用户界设计、形象明确、造型突出的图标&#xff0c;能够迅速地被用户所理解和接受&#xff0c;从而使软件或程序的使用效率提高…

【Javaweb程序设计】【C00163】基于SSM房屋中介服务平台(论文+PPT)

基于SSM房屋中介服务平台&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的房屋中介服务平台 本系统分为前台、管理员、用户3个功能模块。 前台&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的就是首页界面。…

如何使用宝塔面板搭建MySQL 5.5数据库并实现公网远程连接

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cp…

5G_RACH(一)

什么是RACH RACH 代表 Random Access Channel。这是开机时UE发给eNB的第一条消息。 为什么选择RACH &#xff1f;&#xff08;RACH 的功能是什么&#xff1f; 当你第一次听到RACH或RACH Process这个词时&#xff0c;你脑海中浮现的第一个问题是“为什么是RACH&#xff1f;”…

量化交易学习3(量化择时策略)

1 什么是量化择时 量化择时策略&#xff0c;简单来说&#xff0c;就是采用数量化分析方法&#xff0c;利用单个或多个技术指标的组合&#xff0c;来对交易标的股票或股票指数进行低买高卖的操作&#xff0c;期望获得超越简单买入持有策略的收益风险表现。 量化择时策略的核心…