【八大数据排序法】选择排序法的图形理解和案例实现 | C++

news2024/10/10 0:22:16

第十五章    选择排序法


目录

第十五章    选择排序法

●前言

●认识排序

●一、选择排序法是什么?

1.简要介绍

2.图形理解

 3.算法分析

●二、案例实现

1.案例一

● 总结


前言

        排序算法是我们在程序设计中经常见到和使用的一种算法,它主要是将一堆不规则的数据按照递增或递减的方式重新进行排序。在如今的互联网信息时代,随着大数据和人工智能的发展,大型企业的数据库中有亿级的用户数据量。因此对其进行处理,排序算法也就成为了其中必不可缺的步骤之一。 


认识排序

       排序功能对计算机领域而言,是一项非常重要而且普遍的工作。排序中数据的移动方式可分为直接移动和逻辑移动两种方式,直接移动是直接交换存储数据的位置,而逻辑移动并不会移动数据存储的位置,仅改变指向这些数据辅助指针的值。排序通常按照数据量的多少和所使用的内存,可分为内部排序和外部排序,数据量小可以全部加载到内存来进行排序的,就称为内部排序,大部分排序属于此类。数据量大而无法一次性加载到内存中,必须借助磁带,磁盘等辅助存储器进行排序的,则称为外部排序。随着数据结构科学的进步,如今,陆续被提出的冒泡排序法,选择排序法,插入排序法,合并排序法,快速排序法,堆积排序法,希尔排序法,基数排序法,直接合并排序法等等,它们各有其特色和其应用场合。并且在算法中,我们非常关注算法程序代码的时间复杂度和空间复杂度,因为它会直接体现出我们程序代码的执行效率以及编程人员的逻辑思维等等的综合能力。当数据量相当庞大时,排序算法所花费的时间就显得相当重要,排序算法的时间复杂度可分为最好情况、最坏情况以及平均情况。另外,对于任何的排序算法都会有数据交换的操作,数据互换位置会暂时用到一个额外的空间,这也是排序算法中空间复杂度要考虑到的问题,而在排序算法中所使用的额外空间越小,它的空间复杂度就越好。


一、选择排序法是什么?

1.简要介绍

        选择排序法属于枚举法的一种应用,它就是反复地从未排序的数列中找出最小的数据元素,再将其与某个指定位置的数据元素进行交换,经过每次扫描都可以把该次扫描时数列中的数据元素的最小的那个放到前面的指定位置,从而最终得到的结果就是排序后的数列。

2.图形理解

        下面我们用选择排序法对下图中的这5个数据元素进行从小到大的排序:

         首先找到这5个数据元素中的最小值,并且与数列中的第一个元素进行交换,如图所示:

         从第二个值开始找,找到此时剩余的四个数据元素(不包含第一个)中的最小值,再与第二个数据元素进行交换,如图所示:

         从第三个值开始找,找到此时剩余的三个数据元素(不包含第一个、第二个)中的最小值,再与第三个数据元素进行交换,如图所示:

         从第四个值开始找,找到此时剩余的两个数据元素(不包含第一个、第二个、第三个)中的最小值,再与第四个数据元素进行交换。这样经过四次扫描下来也就完成了对这5个数据的全部排序,如图所示:

 3.算法分析

n个元素的选择排序法需要执行n-1次扫描排序操作:

        ①选择排序法是以最大值或最小值直接与最前方未排序的键值进行交换,数据排列的顺序可能被改变,所以它不属于稳定排序。

        ②选择排序法只需要一个额外的空间,所以空间复杂度为最佳。

        ③选择排序法比较适用于数据量小或已经有部分数据排好序的情况。

        ④该排序法无论是最坏情况,最好情况还是平均情况它都是需要去找到最大值或最小值,因此其时间复杂度为O(n^2)。

二、案例实现

1.案例一

①范例情况:使用选择排序法对9,7,5,3,4,6这六个数据进行从小到大的排序,并且输出每次扫描下的排序情况。

②代码展示:

#include<iostream>
#include<iomanip>
using namespace std;
#define size 6 //事先声明排序数据的个数
class select {
public:
	int data[size];
	void showresult(){
		for (int i = 0; i < size; i++)
			cout << setw(2) << data[i];
		cout << endl;
	}
	void select_start() {
		for (int i = 0; i < size-1; i++)      //扫描5次
		{ 
			for (int j = i + 1; j < size; j++)    //从i+1个数据起开始比较,目的就是从中找出最小值
			{
				if (data[i] > data[j])     //比较第i个和第j个元素
				{
					int temp;
					temp = data[i];
					data[i] = data[j];
					data[j] = temp;
				}
			}
			cout << "第" <<  i+1 << "次扫描:";
			showresult();
		}
	}
};
void text()
{
	select s;
	cout << "请输入要排序的"<<size<<"个数据"<< endl;
	for (int i = 0; i < size; i++)
		cin>>s.data[i];
	cout << "排序前:" << endl;
	s.showresult();
	s.select_start();
	cout << "排序后:" << endl;
	s.showresult();
}
int main()
{
	text();
}

③结果展示:


 总结

        以上就是对选择排序法的简单讲解,以上的案例实现中我们运用的是简单的直接选择排序的一种思想,在后续的章节中会陆续讲到树形选择排序和堆排序来进阶的去体会选择排序法带给我们的排序编程思想。

                                               <您的三连和关注是我最大的动力>

                       🚀 文章作者:Keanu Zhang        分类专栏:算法之美(C++系列文章)

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

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

相关文章

活体识别3:论文笔记之《FACE ANTI-SPOOFING BASED ON COLOR TEXTURE ANALYSIS》

说明 本文是我对论文《FACE ANTI-SPOOFING BASED ON COLOR TEXTURE ANALYSIS》做的一个简单笔记。 这个论文是芬兰奥卢大学(Oulu)课题组的一篇很有代表性的论文&#xff0c;写于2015年&#xff0c;使用的是“LBP特征SVM分类器”这种比较传统的方案&#xff0c;方案不复杂&…

如何使用 JuiceFS 创建 WebDAV 共享

WebDAV 是一种基于 HTTP 的文件共享协议&#xff0c;最初被设计用于多用户文档协作编辑的场景&#xff0c;也被广泛应用在基于互联网的文件存储、数据同步等网盘类应用场景。 手机端和 PC 端有大量的应用内置了对 WebDAV 的支持&#xff0c;比如知名的文献管理工具 Zotero、iP…

微信小程序 java Springboot校园租房指南房屋租赁系统

东前端&#xff1b;首页、房源信息、租房指南、我的&#xff0c;用户前端&#xff1b;首页、房源信息、租房指南、我的等主要功能模块的操作和管理。 1.出租房源信息的上传、审核、发布&#xff1b; 2.租房信息的浏览、查找、查看&#xff1b; 3.用户与出租方通信&#xff1b; …

Docker-01基本命令

1、Docker安装 系统镜像为Centos7.x yum包更新到最新 sudo yum update安装需要的软件包&#xff0c;yum-util提供yum-config-manager功能。另外两个是devicemapper驱动依赖的 sudo yum install -y yum-utils device-mapper-persistent-data lvm2设置yum源为阿里云 sudo yu…

OpenText 企业内容管理平台客户案例——印度鲁宾(Lupin)制药公司

OpenText 企业内容管理平台客户案例——印度鲁宾&#xff08;Lupin&#xff09;制药公司 公司&#xff1a;Lupin 行业&#xff1a;制药 方案&#xff1a; OpenText™ Extended ECM Platform OpenText™ AppWorks™ OpenText™ Capture 合作伙伴&#xff1a;Muraai Informat…

uniapp数据缓存与apk打包

目录 一、uniapp数据缓存Storage 1.1、存值uni.setStorageSync(KEY,DATA) 1.2、取值uni.getStorageSync(KEY) 1.3、uni.removeStorageSync(KEY) 1.4、uni.clearStorageSync() 二、配置发行H5--打包 一、uniapp数据缓存Storage 1.1、存值uni.setStorageSync(KEY,DATA) 含…

APISIX介绍和安装使用

APISIX目录什么是APISIX&#xff1f;与 Kong的比较概述安装1. 安装依赖2 安装 Apache APISIX2.1 安装脚本2.2 启动 APISIXAPISIX 控制台动态负载均衡1. 启动2个微服务命令2.验证服务是否正常3. 重要概念4.创建 APISIX Upstream&#xff08;上游&#xff0c;后端 API 服务&#…

Python(12)--元组

一、元组的基本介绍 元组&#xff08;tuple&#xff09;&#xff1a;这种数据类型结构与列表相同&#xff0c;但它与列表也有很大的差异&#xff0c;它的元素值与元素个数不可更改。 列表的定义是将元素放入[ ]中&#xff0c;元组的定义是将元素放入&#xff08;&#xff09;中…

通过堆转储快照定位JVM堆内存OOM的问题

目录获取堆转储快照JVM启动时增加参数通过jmap指令生成分析堆转储快照Eclipse Memory Analyzer简介示例获取堆转储快照 如何获取堆转储快照&#xff1f;常用的有两种方式&#xff1a; JVM启动时增加参数 出现OOM时生成堆dump&#xff1a; -XX:HeapDumpOnOutOfMemoryError指…

【2325. 解密消息】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你字符串 key 和 message &#xff0c;分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下&#xff1a; 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。将…

【数据结构初阶】第六篇——二叉树的重要性质

树的概念及结构 树的概念 树中专有名词 树的表示 二叉树的概念及其重要性质 二叉树的概念 数据结构中的二叉树 特殊的二叉树 二叉树的性质 二叉树的存储结构 顺序结构 链式结构 树的概念及结构 树的概念 树是一种非线性的数据结构&#xff0c;它是由n(n>0)个有…

【算法】Brute-Force 算法

目录1.概述2.代码实现本文参考&#xff1a; 《数据结构教程》第 5 版 李春葆 主编 1.概述 &#xff08;1&#xff09;设有两个串 s 和 t&#xff0c;串 t 的定位就是要在串 s 中找到一个与 t 相等的子串。通常把 s 称为目标串(target string)&#xff0c;把 t 称为模式串(patt…

flutter 之 ListView的使用与详解 map for listview.builder 的使用

1.ListView 配合ListTile 实现新闻列表样式 ListView(children: <Widget>[ListTile(title: const Text(我是 title),subtitle: const Text(我是 sub_title),leading: Image.asset(images/c.png,fit: BoxFit.cover,),trailing: const Icon(Icons.chevron_right,size: 22,…

九龙证券|港股盘中暴涨110%!多股涨停,有色、汽车板块爆发!

阴历兔年春节后第三个交易日上午&#xff0c;A股首要指数重回涨势&#xff0c;全体走势略显震动胶着。北向资金持续呈现净买入趋势&#xff0c;半响净买入额到达30.61亿元。 港股方面&#xff0c;全体体现也较好&#xff0c;恒生科技指数领涨。港股个股方面亮点纷呈&#xff0c…

信息安全管理体系认证

​ISO信息安全管理体系认证 一、什么是ISO信息安全管理体系认证&#xff1f; ISO是信息安全管理体系认证&#xff0c;是由国际标准化组织&#xff08;ISO&#xff09;采纳英国标准协会BS-2标准后实施的管理体系&#xff0c;成为了“信息安全管理”的国际通用语言&#xff0c;企…

Unity Shader - Curved World - 类似 地铁跑酷,动物森友会 的世界扭曲效果 - 球形透视

我发现莉莉丝的《神觉者》在战斗中也有使用到这个效果&#xff0c;视觉效果提升还是很大的 比如&#xff0c;球形投影前的效果 球形投影后的效果 GIF: ShaderLab cginc 固定 Vector.forward 方向的球形透视 参考&#xff1a; Shader in Unity & Curved world shader …

Nacos学习:二、配置中心

2. 配置中心 配置中心将配置从各应用中剥离出来&#xff0c;对配置进行统一管理&#xff0c;应用自身不需要自己去管理配置。 配置中心的服务流程如下&#xff1a; 1、用户在配置中心更新配置信息。 2、服务A和服务B及时得到配置更新通知&#xff0c;从配置中心获取配置。 …

uni-app - H5 网站项目接入集成 51LA 网站统计详细教程(提供 51LA.js 官方插件与引入教程)

前言 如果您需要 Nuxt.js H5 网站项目的引入方式,请访问:Nuxt.js - 网站项目接入 51LA 网站统计 这个需求不常见,网上几乎没有教程,本文来做最新最好用的引入方案。 本文实现了 uniapp 开发的 H5 网页项目,要求接入 51LA 网站统计 的需求, 跟着本文,简简单单的几个步骤…

【HTML】有趣的代码合集(附源码)

文末有源码下载&#xff0c; “窝” 不信你全都看不上 文章目录CSS3 登录表单 个性化登录按钮可爱的CSS3圆盘时钟动画jQuery登录表单CSS3超酷弹出对话框 兼容移动端HTML5翻牌消除小游戏交互式分享按钮 可横向展开HTML5文件上传美化表单 支持拖拽上传纯CSS3加载Loading动画图 12…

unity怎样让玩家在不同材质上行走具有不同脚步声音效

问题:玩家在草地,雪地,木板上行走需要不同的脚步声音效,且无论行走还是奔跑,音效都要和脚步动画同步.思路:在动画上添加事件触发脚步声音效,并判断地面的材质然后播放不同的音效.实现:一.判断地面材质第一种情况是在unity内置terrain上行走地面有草地,石地,木地等,需要有不同音…