当前位置: 首页 > news >正文

选择排序详解

选择排序

基本思想:每⼀次从待排序的数据元素中选出最⼩(或最⼤)的⼀个元素,存放在序列的起始位置或终止位置,直到全部待排序的数据元素排完。

直接选择排序
  • 在元素集合array[i]--array[n-1]中选择关键码最大(小)的数据元素
  • 若它不是这组元素中的最后⼀个(第⼀个)元素,则将它与这组元素中的最后⼀个(第⼀个)元素交换
  • 在剩余的array[i]--array[n-2]array[i+1]--array[n-1])集合中重复上述步骤,直到集合剩余1个元素
    提醒:当然我们也可以同时找最大的和最小的,加快速度。(本讲解代码便是同时找当前未排序序列中最大的和最小的)
    在这里插入图片描述

代码如下:

void my_swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}
void SelectSort(int arr[], int n)
{int begin = 0, end = n - 1;int mini = 0, maxi = 0;while (end > begin){//每次进入循环后要重新开始搞起mini = maxi = begin;for (int i = begin + 1; i <= end; i++){if (arr[i] < arr[mini]){mini = i;}if (arr[i] > arr[maxi]){maxi = i;}}//下面的两次交换mini与begin的交换可能会影响end与maxi的交换if (maxi == begin){maxi=mini;}my_swap(&(arr[begin]), &(arr[mini]));my_swap(&(arr[end]), &(arr[maxi]));begin++;end--;}
}

直接选择排序算法详解
第一部分:

mini = maxi = begin;for (int i = begin + 1; i <= end; i++){if (arr[i] < arr[mini]){mini = i;}if (arr[i] > arr[maxi]){maxi = i;}}

先随机将最大值下标maxi和最小值下标mini赋值给未排序部分第一个元素下标left,并分别在循环中,按照条件arr[i] < arr[mini]arr[i] > arr[maxi]更新minimaxi从而找到这个未排序序列里面的最大值和最小值下标。
第二部分:

	if (maxi == begin){maxi=mini;}my_swap(&(arr[begin]), &(arr[mini]));my_swap(&(arr[end]), &(arr[maxi]));

找到maximini则将这个未排序的beginend分别于minimaxi位置元素互换位置。但是存在特殊情况。在这里插入图片描述
为了解决这个问题,我们要添加一个条件当maxi == begin,将mini的值赋值给maxi在这里插入图片描述
第三部分:

begin++;
end--;

将这个序列的第一个和最后一个数组从待排序的序列中去除,并设置循环条件为end>begin

时间复杂度和空间复杂度

时间复杂度:O(n2
空间复杂度:O(1)

最后补充说明:堆排序也是选择排序的一种,如果想要了解堆相关知识和堆排序可以点击–>堆的基础概念和堆排序

http://www.dtcms.com/a/532193.html

相关文章:

  • 暖色网站模板wordpress 翻译 每页
  • ProcDump 学习笔记(6.9):MiniPlus 转储(-mp)——轻量却够用的现场证据
  • 特乐网站建设如何用源码搭建网站源码
  • Java 大视界 -- Java 大数据实战:分布式架构重构气象预警平台(2 小时→2 分钟)(428)
  • 洗牌算法讲解——力扣384.打乱数组
  • 芋道源码:VUE3部署:避坑--验证码不现显示,管理后台无法访问后端接口等,完善中。。。
  • 前端速通—ajax篇
  • 济南建立网站湖南建筑工程信息平台
  • android 堆栈打印
  • 太原网站优化排名北京互联网排名
  • 2025-web集群-问题总结
  • CATWIFI
  • 智能旅行助手Agent实战:前后端分离的多Agent系统
  • java基础-练习
  • nginx 配置超时时间
  • apache 配置超时时间
  • 网站开发工作时间个人网页设计作品及设计理念
  • 【Android】View 事件分发机制与源码解析
  • AIGC(生成式AI)试用 38 -- 程序(Python + OCR)-1
  • s001网站建设设计微信营销网络营销方式
  • #PCIE#《PCIE P2P 传输那点事儿》
  • HTTP | 跨域 - 知识点总结
  • 解决[PM2][ERROR] Script not found: D:\projects\xxx\start
  • 开发一款连接带有GEM/SECS协议软件的设备(一)
  • 大连微信网站开发app软件开发培训班
  • 同仁微网站建设工作室微信辅助网站制作
  • FFmpeg 基本数据结构 AVPacket分析
  • Linux at命令详解:轻松调度延迟任务
  • 线程停止、休眠、礼让、强制执行、观测线程状态
  • 复盘|嵌入式Linux驱动开发之I2C子系统