直接选择排序

简介: 直接选择排序

一、算法简介


1.排序思想

选择排序的思想就是通过遍历无序序列,每次从无序序列中选出最小(或最大)的元素,将其放到依次放到序列的起始(或末尾)位置,直到全部待排序的元素排序完成。


流程演示:


每次从待排序序列中选取最大元素,将其交换到待排序序列末尾,若最大元素本身就在末尾则不需要交换;待排序序列长度减一。经过n-1趟选择即可完成排序。


image.png


2.优化思路


在每次遍历待排序序列选取元素时,我们可以同时选取最大和最小两个元素,然后分别将其放到序列末尾和起始位置即可,这样每趟遍历我们可以一次性排好两个元素,从而提高算法效率。


注意:


采用此思路实现时需注意,当最小元素恰好在序列的最大元素待放入位置时,因为对最大元素进行放入后会改变最小元素位置,所有需要提前改变最小元素的标记位置为最大元素交换前的位置。


示例:


1.png


二、算法实现


1.代码实现


#include<iostream>
using namespace std;
void ArryPrint(int* arr, int size) {//数组打印
  for (int i = 0; i < size; i++) {
  cout << arr[i] << ' ';
  }
}
void SelectSort(int* arr, int size) {//直接选择排序
  for (int i = 0; i < size - 1; i++) {//n-1趟排序,最后一个元素不需要再排序
  int maxPos = 0;
  for (int j = 0; j < size - i; j++) {//寻找待排序序列内最大元素的下标
    if (arr[j] > arr[maxPos]) {
    maxPos = j;
    }
  }
  if (maxPos != size - i - 1) {//若最大元素不在序列末尾,则交换到末尾
    swap(arr[size - i - 1],arr[maxPos]);
  }
  }
}
void SelectSortOP(int* arr, int size) {//直接选择排序优化版
  int begin = 0;//标记待排序序列区间
  int end = size - 1;
  while (begin < end) {//至少还有2个元素
  int minPos = begin;
  int maxPos = begin;
  int index = begin + 1;
  while (index <= end) {//选取待排序序列最大和最小元素
    if (arr[index] > arr[maxPos]) {
    maxPos = index;
    }
    if (arr[index] < arr[minPos]) {
    minPos = index;
    }
    index++;
  }
  if (minPos == end) {//若最小元素恰好在末尾,提前改变其标记位置
    minPos = maxPos;
  }
  if (maxPos != end) {//将最大元素交换到末尾
    swap(arr[maxPos], arr[end]);
  }
  if (minPos != begin) {//将最小元素交换到起始
    swap(arr[begin], arr[minPos]);
  }
  end--;
  begin++;
  }
}
void Test() {
  int arr[] = { 5,8,4,7,1,9,3,2,0 };
  int size = sizeof(arr) / sizeof(arr[0]);
  cout << "排序前:";
  ArryPrint(arr, size);
  //SelectSort(arr, size);
  SelectSortOP(arr, size);
  cout << endl << "排序后:";
  ArryPrint(arr, size);
}
int main() {
  Test();
  return 0;
}


2.测试用例即结果


用例:int arr[] = { 5,8,4,7,1,9,3,2,0 }


普通版本测试结果:

11.png

优化版本测试结果:

12.png


三、性能分析


1.时间复杂度


image.png


根据算法的实现思想和代码实现可知,直接选择排序内循环中代码的执行次数固定为image.png次,与待排序序列的初始状态无关,时间复杂度计算只关心其最终量级,所以直接选择排序算法的时间复杂度为O()。


2.空间复杂度


O(1):


因为算法实现中除了用于标记元素位置的临时变量外,没有借助额外的复制空间,所以直接选择排序的空间复杂度为O(1)。


3.稳定性


不稳定:


因为算法实现中,每次遍历待排序序列选取元素后,是将其放入到序列的最后位置,所以序列中相同元素位置靠前的先放入到序列末尾,靠后的元素后放入末尾,改变了其相对位置,所以直接选择排序不稳定。


相关文章
|
人工智能 前端开发 机器人
【杂谈】扣子(Coze) 初体验
扣子(Coze)是什么 官方原文如下: 扣子(coze.cn)是一款用来开发新一代 AI Chat Bot 的应用编辑平台,无论你是否有编程基础,都可以通过这个平台来快速创建各种类型的 Chat Bot,并将其发布到各类社交平台和通讯软件上。 我们可以理解为一个聊天🤖️,可以在其他平台上发布。那就让我们快速开始吧
3486 0
|
监控 Go
go语言并发实战——日志收集系统(十一)基于etcd来监视配置文件的变化
go语言并发实战——日志收集系统(十一)基于etcd来监视配置文件的变化
264 0
|
6天前
|
云安全 人工智能 运维
当攻击全面Agent化,你的安全防御能否跟上AI Speed?
多起客户侧AK泄露事件应急的真实观察
1296 6
|
5天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
|
9天前
|
存储 人工智能 安全
千问办公官网入口网页版登录:qwenwork.cn 注册送2000积分、登录送100积分
阿里云千问办公(QwenWork)是AI智能工作平台,支持一句话生成PPT、表格、网页、视频及数据分析。个人免费版送2000积分+每日登录赠100分,含1GB存储、5个发布页;企业版198元/席/月起。阿里千问办公QwenWork官网:https://t.aliyun.com/U/0VCTGt 阿里AI工作平台,一句话完成数据分析、PPT 生成、视频剪辑、网页搭建等复杂任务
|
29天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9899 33
|
15天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
7天前
|
Web App开发 人工智能 JavaScript
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA
REA(Reverse Engineer Anything)是近期爆火的开源AI逆向工具,4月发布,1个月内斩获15万+ Star。它让AI Agent无需源码即可分析二进制、APK、JS/Electron、HAR包等17类目标,自动反编译、生成可运行代码,并强制返回带证据与局限的结论。全本地执行,MIT协议,支持Hopper/Ghidra/IDA等引擎,一行命令即可上手。
710 2
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA
|
4天前
|
人工智能 开发者
Qoder CN 大使计划正式开启|无限创造,等你一起
全年免费积分、优先内测、活动支持与更多共创机会,邀请用 Qoder 把想法变成现实的你。
481 0