排序之选择排序

news2024/12/24 2:36:02

文章目录

  • 前言
  • 一、直接选择排序
    • 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的位置了,所以此时未排序元素中最大的元素的下标为mini
		if (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.coloradmin.cn/o/957739.html

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

相关文章

汇编--int指令

中断信息可以来自CPU的内部和外部&#xff0c; 当CPU的内部有需要处理的事情发生的时候&#xff0c;将产生需要马上处理的中断信息&#xff0c;引发中断过程。在http://t.csdn.cn/jihpG&#xff0c;我们讲解了中断过程和两种内中断的处理。 这一章中&#xff0c; 我们讲解另一种…

freemarker学习+集成springboot+导出word

目录 一 FreeMarker简介 二 集成springboot&#xff0c;实现案例导出 三 常见面试题总结 一 FreeMarker简介 FreeMarker 是一款 模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&…

2024河南光伏展|河南储能展|河南国际太阳能光伏储能展览会

2024第四届中国&#xff08;郑州&#xff09;太阳能光伏及储能产业展览会 时间&#xff1a;2024年2月26-28日 地点&#xff1a;郑州.中原国际博览中心 河南国际太阳能光伏及储能产业展览会是一个盛大的行业聚会&#xff0c;旨在展示、交流、合作和创新。这个展览会将会是一个…

MATLAB中residue函数用法

目录 语法 说明 示例 求解具有实根的部分分式展开式 展开具有复数根和同次分子及分母的分式 展开分子次数高于分母次数的分式 residue函数的功能是部分分式展开&#xff08;部分分式分解&#xff09;。 语法 [r,p,k] residue(b,a) [b,a] residue(r,p,k) 说明 [r,p…

echarts饼图点击区块事件

效果图&#xff1a; 代码&#xff1a; let option {color: pieColors,series: [{name: Access From,type: pie,radius: [36%, 56%],avoidLabelOverlap: false,label: {formatter: params > {// console.log(params)return {color${params.dataIndex}|${params.name}(${par…

Scala集合继承体系图

Scala集合简介 1&#xff09; Scala 的集合有三大类&#xff1a;序列 Seq、集Set、映射 Map&#xff0c;所有的集合都扩展自 Iterable特质。 2&#xff09; 对于几乎所有的集合类&#xff0c;Scala 都同时提供了可变和不可变的版本&#xff0c;分别位于以下两个包 不可变集合…

软件确认测试的依据有哪些

确认测试 随着我国软件市场的日益繁荣和软件产品的大量涌现,软件评测的重要性越来越显现出来了。 一、确认测试的作用 1、软件确认测试对保障软件产品质量,开拓国际软件市场,促进软件市场健康发展都将发挥重要作用。 2、确认测试的目的是要表明软件是可以工作的&#xff0c…

【Nacos】2023.9.1 最新Nacos源码启动教程 | 超详细 | 包含踩坑经历和解决办法

在官网下载Nacos源码压缩包&#xff0c;或者使用git克隆到本地&#xff0c;使用IDEA打开项目。 Nacos GitHub地址 修改项目的jdk版本为1.8&#xff0c;修改maven使用的jdk版本也是1.8 打开最外边的pom文件&#xff0c;注释掉代码规范检查的插件&#xff08;nacos源码有些impor…

机器学习——聚类算法一

机器学习——聚类算法一 文章目录 前言一、基于numpy实现聚类二、K-Means聚类2.1. 原理2.2. 代码实现2.3. 局限性 三、层次聚类3.1. 原理3.2. 代码实现 四、DBSCAN算法4.1. 原理4.2. 代码实现 五、区别与相同点1. 区别&#xff1a;2. 相同点&#xff1a; 总结 前言 在机器学习…

springboot+activiti5.0整合(工作流引擎)

概述 springboot整合activiti使用modeler进行流程创建&#xff0c;编辑、部署以及删除实例&#xff08;可运行&#xff09; 详细 1、现在来说一下流程&#xff0c;先建立spring boot项目&#xff0c;导入对应的jar包。 <dependencies><dependency><groupId&…

Java 循环语句解析:从小白到循环达人

如果你正在学习编程&#xff0c;那么循环语句是一个绕不开的重要话题。循环语句让我们能够重复执行一段代码&#xff0c;从而实现各种各样的功能。在本篇博客中&#xff0c;我们将围绕 Java 编程语言中的循环语句展开&#xff0c;从最基础的概念出发&#xff0c;一步步引领你从…

Qt日历控件示例-QCalendarWidget

基本说明 QCalendarWidget介绍&#xff1a; QCalendarWidget 是 Qt 框架中提供的一个日期选择控件,用户可以通过该控件快速选择需要的日期,并且支持显示当前月份的日历。 这里&#xff0c;我们继承了QCalendarWidget&#xff0c;做了一些简单封装和样式调整 1.使用的IDE&…

java_error_in_idea.hprof 文件

在用户目录下的java_error_in_idea.hprof文件(/Users/用户) 大约1.5个G,IDEA的错误日志,可以删除

shiny根据数据的长度设置多个色板

shiny根据数据的长度设置多个色板 library(shiny) library(colourpicker) ui <- fluidPage(# 添加一个选择颜色的下拉菜单uiOutput("color_dropdown") )server <- function(input, output) {# 数据长度data_length <- reactive({length(c("数据1"…

Linux(centos) 下 Mysql 环境安装

linux 下进行环境安装相对比较简单&#xff0c;可还是会遇到各种奇奇怪怪的问题&#xff0c;我们来梳理一波 安装 mysql 我们会用到下地址&#xff1a; Mysql 官方文档的地址&#xff0c;可以参考&#xff0c;不要全部使用 https://dev.mysql.com/doc/refman/8.0/en/linux-i…

文献阅读:Deep Learning based Semantic Communications: An Initial Investigation

目录 论文简介动机&#xff1a;为什么作者想要解决这个问题&#xff1f;贡献&#xff1a;作者在这篇论文中完成了什么工作(创新点)&#xff1f;规划&#xff1a;他们如何完成工作&#xff1f;理由&#xff1a;通过什么实验验证它们的工作结果自己的看法 论文简介 作者 Huiqiang…

day-06 多进程服务器端 -- 进程间通信

一.多进程服务器端 &#xff08;一&#xff09;进程概念及应用 利用之前学习到的内容&#xff0c;我们的服务器可以按照顺序处理多个客户端的服务请求。在客户端和服务时间增长的情况下&#xff0c;服务器就不足以满足需求了。 1.两种类型的服务器端 &#xff08;1&#xff…

安全基础 --- https详解(02)、cookie和session、同源和跨域

https详解&#xff08;02&#xff09;--- 数据包扩展 Request --- 请求数据包Response --- 返回数据包 若出现代理则如下图&#xff1a; Proxy --- 代理服务器 &#xff08;1&#xff09;http和https的区别 http明文传输&#xff0c;数据未加密&#xff1b;http页面响应速度…

【Java 动态数据统计图】动态X轴二级数据统计图思路Demo(动态,排序,动态数组(重点推荐:难)九(131)

需求&#xff1a; 1.有一组数据集合&#xff0c;数据集合中的数据为动态&#xff1b; 举例如下&#xff1a; [{province陕西省, city西安市}, {province陕西省, city咸阳市}, {province陕西省, city宝鸡市}, {province陕西省, city延安市}, {province陕西省, city汉中市}, {pr…

用了这么久SpringBoot却还不知道的一个小技巧

前言 你可能调第三方接口喜欢启动application&#xff0c;修改&#xff0c;再启动&#xff0c;再修改&#xff0c;顺便还有个不喜欢写JUnitTest的习惯。 你可能有一天想要在SpringBoot启动后&#xff0c;立马想要干一些事情&#xff0c;现在没有可能是你还没遇到。 那么SpringB…