排序之选择排序

文章目录

  • 前言
  • 一、直接选择排序
    • 1、直接选择排序基本思想
    • 2、直接选择排序代码实现
    • 3、直接选择排序的效率
  • 二、堆排序
    • 1、堆排序
    • 2、堆排序的效率


前言

选择排序的基本思想就是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

一、直接选择排序

1、直接选择排序基本思想

在元素集合array[i]–array[n-1]中选择值最大(小)的数据元素,若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换,在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重复上述步骤,直到集合剩余1个元素。
例如有如下一个数组。
在这里插入图片描述
先取最小值min在数组中下标为0,然后遍历数组每个元素,并且使每个元素和下标为min的元素比较,如果该元素小于下标为min的元素,就使min等于该元素的下标,然后继续向后比较。
在这里插入图片描述
在这里插入图片描述
当遍历一遍数组后,此时下标为min的元素为数组中最小的元素。
在这里插入图片描述
将下标为min的元素与下标为0的元素交换,使最小的元素在数组首位置,然后将min重新置为1,再次遍历数组寻找第二小的元素。
在这里插入图片描述

2、直接选择排序代码实现

在上述的演示中,每次遍历数组我们只找到了数组中未排序元素中最小的值,然后将该值放在排序好的元素之后。在代码实现时,我们稍微优化了一下,即定义min和max两个变量用来存数组中未排序元素中的最大值和最小值的下标,然后将最小值放在数组前面,最大值放在数组末尾。即每次遍历数组选择出最大值和最小值,然后放入相应的位置。

void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}void SelectSort(int* arr, int n)
{//记录数组的头尾下标int begin = 0;int end = n - 1;while (begin < end){//另数组中未排序的首个元素的下标为未排序元素中的最大值和最小值int mini = begin;int maxi = begin;int i = 0;//从未排序的元素开始遍历数组for (i = begin+1; i <= end; i++){//如果有元素比下标为mini的元素小,就让mini为该元素下标if (arr[i] < arr[mini]){mini = i;}//如果有元素比下标为maxi的元素大,就让max为该元素下标if (arr[i] > arr[maxi]){maxi = i;}}//然后将未排序中最小的元素和下标为begin的元素交换Swap(&arr[begin], &arr[mini]);//此时需要判断如果未排序中最大的元素的下标为begin的话,而执行过Swap(&arr[begin], &arr[mini]);语句后//原来begin下标的元素现在已经交换到下标为mini的位置了,所以此时未排序元素中最大的元素的下标为miniif (begin == maxi){maxi = mini;}Swap(&arr[end], &arr[maxi]);++begin;--end;}}

3、直接选择排序的效率

直接选择排序的复杂度为O(N2),并且就算数组元素为基本顺序有序,直接选择排序的复杂度也为O(N2) 。而当数组元素为基本顺序有序时,直接插入排序的复杂度可以达到O(N),并且只有数组元素逆序为直接插入排序的最差情况。所以综合考虑的话,直接选择排序的效率没有直接插入排序的高。

  1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

二、堆排序

1、堆排序

选择排序的基本思想就是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。而堆结构的堆头结点存的就是整个堆中最大(最小)值,堆排序就是每次将堆中最大(最小)值取出,将堆头结点删除,再重新选出堆中最大(最小)值作为新堆头结点。所以堆排序也是选择排序的一种。
堆排序的详细讲解在下面这篇文章中,可以点击链接进行阅读。
c语言实现堆

2、堆排序的效率

  1. 堆排序使用堆来选数,效率就高了很多。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

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

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

相关文章

Java 的线程安全机制之`synchronized`

前言&#xff1a;首先&#xff0c;线程表示一条单独的执行流&#xff0c;每个线程有自己的执行计数器&#xff0c;有自己的栈&#xff0c;但可以共享内存&#xff0c;共享内存是实现线程协作的基础&#xff0c;但共享内存有两个问题&#xff0c;竞态条件和内存可见性。解决这些…

pdf文件打开后部分文字无法显示

场景&#xff1a;pdf文件在系统内预览正常&#xff0c;但是下载到本地电脑上&#xff0c;使用wps查看&#xff0c;部分标题会消失&#xff0c;只有标题里面的数字还能显示出来 经过一系列排查&#xff0c;发现查看的电脑上缺失了字体&#xff0c;使用wps查看时&#xff0c;缺失…

TCP/IP五层模型、封装和分用

1.网络通信基础2.协议分层OSI七层协议模型TCP/IP五层/四层协议模型【重点】 3. 封装&分用 1.网络通信基础 IP地址&#xff1a;表示计算机的位置&#xff0c;分源IP和目标IP&#xff1b;举个例子&#xff1a;买快递&#xff0c;商家从上海发货&#xff0c;上海就是源IP&…

分布式锁,使用方案

1、锁方案&#xff1a; 可以往数据库中插入一条数据&#xff0c;这条数据利用 唯一索引 使数据是唯一的。 能插入&#xff0c;就表示数据没有锁&#xff0c;可以正常执行 插入报错 ‘数据的唯一性’ &#xff0c;则表示数据已经枷锁了&#xff0c;不能执行 执行完成后&#xff…

MySQL之脏读,不可重复读与幻读的概念及区别

MySQL是一款常用的关系型数据库&#xff0c;但在使用过程中&#xff0c;可能会遇到一些问题&#xff0c;比如脏读、不可重复读和幻读。这些问题可能会导致数据的不一致性&#xff0c;因此需要了解它们的概念及区别。 1. 脏读 首先是脏读。脏读是指在一个事务中读取了另一个事…

【高阶数据结构】AVL树 {概念及实现;节点的定义;插入并调整平衡因子;旋转操作:左单旋,右单旋,左右双旋,右左双旋;AVL树的验证及性能分析}

AVL树 一、AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明…

Vite学习笔记

前言&#xff1a; 在浏览器支持 ES 模块之前&#xff0c;JavaScript 并没有提供原生机制让开发者以模块化的方式进行开发。这也正是我们对 “打包” 这个概念熟悉的原因&#xff1a;使用工具抓取、处理并将我们的源码模块串联成可以在浏览器中运行的文件。 打包构建工具演变&a…

Java泛型机制

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

【UE 材质】模型部分透明

材质节点如下&#xff0c;这里简单解释一下。首先通过“Mask”节点将"Texture Coordinate" 节点中的“G”通道分离出来&#xff0c;然后通过“if”节点进行判断&#xff0c;当值小于0.5时为透明&#xff0c;当颜色不小于5时为不透明。可以通过一个参数来控制模型透明…

会不会激发对modern c++的新兴趣

可变参数好像很厉害的样子&#xff0c;会节省很多手写代码&#xff0c;让编译器自动帮我们生成代码 template<typename Fun, typename...Args> void invoke(Fun&& fun, Args&&...args) { fun(std::forward<Args>(args)...); } 任意函数包装器…

云计算的三个主要服务模型:IaaS、PaaS 和 SaaS

文章目录 介绍基础设施即服务&#xff08;Infrastructure as a Service&#xff0c;IaaS&#xff09;平台即服务&#xff08;Platform as a Service&#xff0c;PaaS&#xff09;软件即服务&#xff08;Software as a Service&#xff0c;SaaS&#xff09; 区别基础设施即服务&…

Java“牵手”天猫淘口令转换API接口数据,天猫API接口申请指南

天猫平台商品淘口令接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取天猫商品的标题、价格、库存、商品快递费用&#xff0c;宝贝ID&#xff0c;发货地&#xff0c;区域ID&#xff0c;快递费用&#xff0c;月销量、总销量、库存、详情描…

代码随想录第五十天|123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 题目链接/文章讲解/视频讲解&#xff1a;代码随想录 1.代码展现 //123.买卖股票的最佳时机 int maxProfit(vector<int>& prices) {if (prices.size() 1) {return 0;}//step1 构建dp数组vector<vector<int>> dp(prices.size(…

etcd读写请求的执行过程

etcd读请求如何执行 首先&#xff0c;etcdctl 会对命令中的参数进行解析。在解析完请求中的参数后&#xff0c;etcdctl 会创建一个 clientv3 库对象通过gRPC API来访问 etcd server。对应流程一。 然后通过负载均衡算法选择一个etcd server节点&#xff0c;然后调用 etcd ser…

python基本数据类型 –元组

python中数据类型 第一类&#xff1a;不可变类型、静态数据类型、不支持增删改操作 数字&#xff08;number&#xff09; 字符串&#xff08;string&#xff09; 元组&#xff08;tuple&#xff09; 布尔类型(bool) 第二类&#xff1a;可变类型、动态数据类型、支持增删改操…

C++(11):生成随机字符串

C++(11):产生随机数_c++11 随机数_风静如云的博客-CSDN博客 介绍了如何生成随机数,可以基于随机数生成随机字符串: #include <cstring> #include <chrono> #include <random> #include <iostream>using namespace std;string getRandomStr(int str…

PyTorch檔案生成機制中的FileManager.write_with_template

PyTorch檔案生成機制中的FileManager.write_with_template 前言FileManager.write_with_template調用gen_pyigen_nn_functionalwrite_sharded FileManager.write_with_template實現torchgen/utils.pyFileManager.write_with_templateFileManager.substitute_with_template_read…

java八股文面试[多线程]——线程池拒绝策略

四种线程池拒绝策略&#xff08;handler&#xff09; 当线程池的线程数达到最大线程数时&#xff0c;需要执行拒绝策略。拒绝策略需要实现 RejectedExecutionHandler 接口&#xff0c;并实现 rejectedExecution(Runnable r, ThreadPoolExecutor executor) 方法。不过…

如何设计微服务

一、序幕 最近在思考&#xff0c;自己哪些不足&#xff0c;需要学习点什么&#xff1f;看着Java基础知识&#xff0c;千遍一律&#xff0c;没有太大的动力需深挖&#xff0c;只能在写业务项目的时候边写边思考边夯实自己的基础。于是看了网上的一些资料&#xff0c;结合以前面试…

J1元器件的功能与应用 | 百能云芯

在现代科技和电子领域中&#xff0c;元器件是构建各种电子设备的基石。其中&#xff0c;J1元器件作为一个备受关注的焦点&#xff0c;在电子工程师和科技爱好者中引发了浓厚的兴趣。百能云芯将带您深入了解J1元器件在电子世界中的作用。 J1元器件是一种通用的连接器&#xff0c…