排序算法之直接选择排序(图文详解)

news2024/11/25 3:01:48

文章目录

  • 一、选择排序思想
  • 二、排序过程详解
    • 2.1 排序的次数
    • 2.2 排序演示
  • 三、代码范例
    • 3.1 SelectSort函数
    • 3.2 整体代码实现
    • 3.3 结果展示
  • 四、选择排序分析
    • 4.1 稳定性
    • 4.2 复杂度
    • 4.3适用场景
  • 五、选泽排序优化
  • 总结

一、选择排序思想

选择排序(Selection sort)是一种比较简单直观的排序算法。它的工作原理是:.每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到待排序的数据元素的个数排完为止。

二、排序过程详解

2.1 排序的次数

因为每排好一个元素,那么所需要排的元素个数减一,直到排到倒数第二个元素停止,将倒数第二个元素也排好后,整体数组排序就完成了。所以 排序的次数 = 元素个数 - 1

2.2 排序演示

eg:原始值:5,2,8,6,1

第一次:先找到该数列中最小值,然后与数列中第一个元素交换
// 交换后:1,2,8,6,5
第二次:从第二项开始查找,未排序列中的最小值,再与第二项元素交换位置
// 交换后:1,2,8,6,5
第三次:从第三项开始查找
// 交换后:1,2,5,6,8
第四次:从第四项开始查找
// 交换后:1,2,5,6,8

三、代码范例

3.1 SelectSort函数

void SelectSort(int* a, int length)//简单选择排序算法实现
{
	for (int i = 0; i < length; ++i)
	{
		int min = i;//min记录最小值
		for (int j = i + 1; j < length; ++j)//遍历确定最小值
		{
			if (a[j] < a[min])
				min = j;
		}
		if (min != i)//交换最小值与待排序列第一个位置
		{
			int temp = a[i];
			a[i] = a[min];
			a[min] = temp;
		}
	}
}

3.2 整体代码实现

#include<stdio.h>

void SelectSort(int* a, int length)//简单选择排序算法实现
{
	for (int i = 0; i < length; ++i)
	{
		int min = i;
		for (int j = i + 1; j < length; ++j)
		{
			if (a[j] < a[min])
				min = j;
		}
		if (min != i)
		{
			int temp = a[i];
			a[i] = a[min];
			a[min] = temp;
		}
	}
}

int main()
{
	int a[10] = { 14,23,52,15,25,3,6,8,72,45 };
	int length = sizeof(a) / sizeof(a[0]);
	printf("排序前:\n");
	for (int i = 0; i < length; i++)
	{
		printf("%d  ", a[i]);
	}
	printf("\n");
	SelectSort(a, length);
	printf("排序后:\n");
	for (int i = 0; i < length; i++)
	{
		printf("%d  ", a[i]);
	}
	return 0;
}

3.3 结果展示

在这里插入图片描述

四、选择排序分析

4.1 稳定性

在选择排序中,每趟都会选出最大元素或最小元素,然后与顶端元素交换,此时,待排序序列中如果存在与原来两端元素相等的元素,稳定性就可能被破坏。如[5,3,5,2,9],在array[0]与array[3]元素交换时,序列的稳定性就被破坏了,所以选择排序是一种不稳定的排序算法

4.2 复杂度

选择排序的时间复杂度为O(n^2)
   选择排序的空间复杂度为O(1)

4.3适用场景

待排序序列中,元素个数较少时

五、选泽排序优化

选择排序的优化思路一般是在一趟遍历中,同时找出最大值与最小值,放到数组两端,这样就能将遍历的趟数减少一半。第一次选择最大值与最小值。
  这里博主偷个懒,就留给大家去实现代码实例吧!!

总结

欢迎关注博主,博主会在第一时间去更新排序的有关问题以及c/java中的其他有关知识,望大家支持!!一起进步

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

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

相关文章

ABBYY15免费版直接编辑PDF格式文件

日常生活中&#xff0c;我们常常使用PDF格式的文件。其优点就是PDF的文本内容不会随着软件版本、电脑字体的变化而变化&#xff0c;保证了其完整性。但也正因为这一点&#xff0c;如果没有源文件&#xff0c;我们就很难对PDF文档的内容进行编辑了。今天&#xff0c;我就向大家展…

前端一面必会vue面试题(边面边更)

为什么要使用异步组件 节省打包出的结果&#xff0c;异步组件分开打包&#xff0c;采用jsonp的方式进行加载&#xff0c;有效解决文件过大的问题。核心就是包组件定义变成一个函数&#xff0c;依赖import() 语法&#xff0c;可以实现文件的分割加载。 components:{ AddCustom…

关于GitHub的.gitignore无法忽略 “default-2021.dwlt“ 文件的问题

问题描述 我在使用sourcetree往github提交工程时&#xff0c;UserSettings/Layouts/default-2021.dwlt文件无缘无故每次都被暂存。 尽管我在.gitignore文件中反复修改忽略路径&#xff0c;该文件始终无法被屏蔽。如下图 解决办法 在网上找了很多资料&#xff0c;最终找到了…

Qt扫盲-QListWidget理论总结

QListWidget理论总结1. 概念2. 添加列表项3. 列表其他属性4. 常用信号5. 槽函数6. QListWidgetItem 简述1. 概念 QListWidget 是一个继承自 QListView 的类&#xff0c;其实就是 QListView 的一个很经典的 列表 交互控件&#xff0c;在QListWidget 里面提供了非常方便的基于 每…

银树开花精美甘特图:VARCHART_XGantt_5.2_167_ActiveX

增强您的计划用户体验 使用交互式甘特图提供惊人的视觉调度体验 与时间和资源相关的计划数据&#xff08;例如工作、任务、订单、活动和能力&#xff09;最好显示在甘特图中。 在智能甘特图中&#xff0c;计划人员可以随手采取纠正措施。 加快您的开发并 创建引人入胜、易于使用…

爬虫学习-深入了解爬虫

爬虫深入 使用场景分类 通用爬虫&#xff1a;抓取系统的重要组成部分&#xff0c;抓取的是一整张页面数据聚焦爬虫&#xff1a;建立在通用爬虫的基础之上&#xff0c;抓取的是页面中特定的局部内容增量式爬虫&#xff1a;检测网站中数据更新的情况&#xff0c;只会抓取网站中最…

一起学习用Verilog在FPGA上实现CNN----(三)激活层设计

1 激活层设计 LeNet-5网络的激活函数是双曲正切函数(TanH)&#xff0c;项目中tanh函数模块由完整的层UsingTheTanh构成&#xff0c;该层由较小的处理单元HyperBolicTangent组成 1.1 HyperBolicTangent 处理单元HyperBolicTangent&#xff0c;对每个输入执行Tanh操作&#xf…

jsp+ssm计算机毕业设计动物救助平台【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

实训任务4:Hadoop综合操作

文章目录1. 启动Hadoop服务2. 创建文本文件3. 上传文本文件4. 显示文件内容5. 完成排序任务6. 计算最大利润和平均利润1. 启动Hadoop服务 在master虚拟机上执行命令&#xff1a;start-all.sh 2. 创建文本文件 在master虚拟机上创建本地文件students.txt 李晓文 女 20 张晓航 男…

【Redis集群专题】「集群技术三部曲」分析一下相关的Redis集群模式下的脑裂问题(问题篇)

技术格言 世界上并没有完美的程序&#xff0c;但是我们并不因此而沮丧&#xff0c;因为写程序就是一个不断追求完美的过程。 什么是脑裂 字面含义 首先&#xff0c;脑裂从字面上理解就是脑袋裂开了&#xff0c;就是思想分家了&#xff0c;就是有了两个山头&#xff0c;就是有…

电脑调用 iPhone 摄像头全过程(iVCam)

最近不是停课不停学吗&#xff0c;令人“深恶痛绝”的钉钉又进入了我们学生的生活。但是初中的网课相比小学的又增加了一个要求&#xff1a;全程摄像头拍摄。但是&#xff0c;我这笔记本没有摄像头啊&#xff01;突然想起来好像手机的摄像头可以给电脑调用。话不多说&#xff0…

3D数学基础 学习笔记

左手坐标系&#xff1a;DX、3DMax 右手坐标系&#xff1a;OpenGL 世界坐标系、物体坐标系、摄像机坐标系 向量和点在数学上是等价的&#xff0c;向量是有大小和方向的有向线段&#xff0c;向量没有位置&#xff0c;只有大小和方向 向量运算&#xff1a; 零向量&#xff1a;…

【看源码】@Cacheable和@CacheEvict的原理, 批量key过期失效的原因分析

Cacheable和CacheEvict的坑, 批量key过期失效的原因分析前言测试代码源码put缓存时最终key的产生看不同情况下, 是否能匹配Evict过期缓存1. 没有入参没有指定key的情况2. 有入参的情况3. 配置了allEntries的情况总结补充前言 最近发现自己搭的一个项目返回的数据不太准确, 第一…

网工Python之路——Netmiko模块实验(思科)

小白网工的python之路 「Python 网络自动化」Netmiko 实验环境 我的实验环境是GNS3搭建拓扑图&#xff0c;用云桥接到在VMware Workstation 16运行的CentOS 7, CentOS 7上搭建好了python3.8&#xff0c; 所有交换机已经预配好了SSH服务&#xff0c;ssh登录账号为python&…

paddle

paddle预测库 git config --global http.postBuffer 1048576000 git clone --recursive https://github.com/PaddlePaddle/Paddle.git 修改CMakeLists.txt mkdir build cd buildcmake -DWITH_CONTRIBOFF -DWITH_MKLOFF -DWITH_MKLDNNOFF -DWITH_TESTINGOFF -DCMAKE_BUILD_TY…

DBCO-PEG-Ferrocene,Ferrocene-PEG-DBCO,DBCO偶联修饰二茂铁

DBCO-PEG-Ferrocene &#xff0c;Ferrocene-PEG-DBCO&#xff0c;二苯并环辛炔-聚乙二醇-二茂铁&#xff0c;DBCO偶联修饰二茂铁产品规格&#xff1a; 1.CAS号&#xff1a;N/A 2.分子量MV&#xff1a;1000、2000、3400、5000、10000、20000等可按需进行定制 3.包装规格&#xf…

数据结构与算法_空间复杂度

同时间复杂度一样&#xff0c;空间复杂度也是数学的函数表达式。 空间复杂度不是程序占用了多少 bytes的空间&#xff0c;因为这个也没太大意义&#xff0c;所以空间复杂度算的是运行的过程中临时的、额外的变量的个数。 空间复杂度计算规则基本跟实践 复杂度类似&#xff0c…

Flutter For App——一个简单的豆瓣APP

一个简单的豆瓣APP效果视频功能简述功能第三方库接口简述底部导航栏效果图实现初始化BottomNavigationBarItembottomNavigationBar切换页面导致bottomNavigationBar子页面重绘Top250榜单效果图实现Widget树FutureBuilder异常ListView上拉加载电影详情效果图实现高斯模糊网络数据…

设计模式原则 - 单一职责原则(一)

单一职责原则一 官方定义基本介绍二 案例演示普通方式实现解决方案解决方案一解决方案案例分析解决方案二解决方案案例分析案例总结三 注意事项&细节四 如何遵守单一职责原则&#xff1f;一 官方定义 单一职责原则&#xff08;Single Responsibility Principle, SRP&#x…

用Spark写入Mysql的特别注意事项

相信有部分刚入门的小伙伴对于spark写入Mysql的过程不太熟悉。特意写一篇文章讲一下这个注意事项&#xff0c;以免“上大当” 我们先看一个小伙伴写的一段spark写入mysql的代码 public static void trans(SparkSession spark,String pro_table, String pro_url, String pro_dr…