十大经典排序算法——选择排序和冒泡排序

一、选择排序 

1.基本思想

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

2.直接选择排序

(1) 在元素集合arr[i] — arr[n - 1]中选择关键妈的最大(小)的数据元素

(2) 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素的最后一个(第一个)元素交换

(3) 在剩余的arr[i] — arr[n - 2](arr[i + 1] — arr[n - 1])集合中,重复上述步骤,知道集合剩余1个元素

3.直接选择排序的特性总结

(1)直接选择排序的效率不高,实际中很少用

(2)时间复杂度:O(N^{2})

(3)空间复杂度:O(1)

(4)稳定性:不稳定

4.图示

//选择排序
void SelectSort2(int* arr, int n)
{for (int j = 0; j < n; j++){for (int i = j + 1; i < n; i++){if (arr[i] < arr[j]){swap(&arr[j], &arr[i]);}}}
}

5.选择排序优化

用begin和end来做边界,maxi和mini来记录数组中最大值和最小值的下标。

//选择排序优化
void SelectSort(int* arr, int n)
{int begin = 0,end = n - 1;while (begin < end){int mini = begin, maxi = begin;for (int i = begin + 1; i <= end; i++){if (arr[i] < arr[mini]){mini = i;}if (arr[i] > arr[maxi]){maxi = i;}}swap(&arr[mini], &arr[begin]);if (begin == maxi){maxi = mini;}swap(&arr[maxi], &arr[end]);--end;++begin;}
}

二、冒泡排序

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有在需要交换,也就是说该数列已经排序完成。这个算法的名字由来是应为越小的元素会经由交换慢慢“浮”到数列的顶端。

1.算法描述

(1) 比较相邻的元素。如果第一个比第二个大,就交换它们两个

(2) 对每一对相邻元素作相同的工作,从第一对到结尾最后一对,这样在最后的元素就是最大的数

(3)针对所有的元素重复以上的步骤

(4)重复步骤1—3,直到排序完成

2.动图演

3.代码演示

//冒泡排序  
// O(N^2)最坏
// O(N)最好
void swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
void BubbleSort(int* arr, int n)
{for (int j = 0; j < n; j++){int flag = 0;//用来记录是否发生交换for (int i = 0; i < n - 1; i++){if (arr[i] > arr[i + 1]){swap(&arr[i], &arr[i + 1]);flag = 1;}}if (flag == 0){//一趟下来没有交换,说明已经有序,跳出循环  break;}}
}

三、选择排序与冒泡排序效率对比

void TestOP()
{srand(time(0));const int N = 50000;int* a1 = (int*)malloc(sizeof(int) * N);int* a2 = (int*)malloc(sizeof(int) * N);for (int i = 0; i < N; ++i){a1[i] = a1[i];a2[i] = a1[i];}int begin1 = clock();SelectSort(a3, N);int end1 = clock();int begin2 = clock();BubbleSort(a6, N);int end2 = clock();printf("SelectSort:%d\n", end1 - begin1);printf("BubbleSort:%d\n", end2 - begin2);free(a1);free(a2);}int main()
{int arr[] = { 9,1,2,5,7,4,6,3,8 };int sz = sizeof(arr) / sizeof(arr[0]);TestOP();return 0;
}

对50000个随机数进行排序,两种排序所用时间如下图:

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

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

相关文章

高考十字路口:24年考生如何权衡专业与学校的抉择?

文章目录 每日一句正能量前言专业解析理工科专业商科专业人文社科专业艺术与设计专业个人经验与思考过程结论 名校效应分析名校声誉与品牌效应资源获取学术氛围就业优势个人发展结论 好专业和好学校的权衡个人职业目标行业需求教育质量资源和机会学术氛围就业优势经济和地理位置…

嵌入式学习——数据结构(单向无头链表)——day46

1. 数据结构 1.1 定义 数据结构是指计算机中数据的组织、管理和存储方式。它不仅包括数据元素的存储方式&#xff0c;还包括数据元素之间的关系&#xff0c;以及对数据进行操作的方法和算法。数据结构的选择和设计直接影响算法的效率和程序的性能&#xff0c;是计算机科学与编…

uniapp 低功耗蓝牙BLE分包

ble.js // 分包写入蓝牙async sendWriteBLECharacteristicValue(deviceId,serviceId,writeCharacteristicId,readCharacteristicId,buffer,success, // 成功回调failure, // 失败回调) {const offset 500; // 偏移量let pos 0; // 位置let bytes buffer.byteLength; // 总字…

.env 文件详解(vite)

.env.development 开发环境.env.production 正式环境.env.test 测试环境 .env文件内容&#xff1a; 开发环境 # 当前环境&#xff0c;VITE_ 开头 VITE_NODE_ENV development # 请求基地址 VITE_BASE_URL /api # 本地代理目标地址&#xff0c;在proxy里面target里面用 VITE…

说一说三大运营商的流量类型,看完就知道该怎么选运营商了!

说一说三大运营商的流量类型&#xff0c;看完就知道该怎么选运营商了&#xff1f;目前三大运营商的流量类型大致分为通用流量和定向流量&#xff0c;比如&#xff1a; 中国电信&#xff1a;通用流量定向流量 电信推出的套餐通常由通用流量定向流量所组成&#xff0c;通用流量…

【Python时序预测系列】基于LSTM实现单变量时序序列多步预测(案例+源码)

这是我的第307篇原创文章。 一、引言 单站点单变量输入单变量输出多步预测问题----基于LSTM实现。 单输入就是输入1个特征变量 单输出就是预测出1个标签的结果 多步就是利用过去N天预测未来M天的结果 二、实现过程 2.1 读取数据集 # 读取数据集 data pd.read_csv(data.c…

HTML5文旅文化旅游网站模板源码

文章目录 1.设计来源文旅宣传1.1 登录界面演示1.2 注册界面演示1.3 首页界面演示1.4 文旅之行界面演示1.5 文旅之行文章内容界面演示1.6 关于我们界面演示1.7 文旅博客界面演示1.8 文旅博客文章内容界面演示1.9 联系我们界面演示 2.效果和源码2.1 动态效果2.2 源代码2.3 源码目…

Spring Boot框架原理及应用详解(三)

本系列文章简介: 在当今的软件开发世界中,快速迭代、高效开发以及易于维护成为了开发者们不断追求的目标。Spring Boot作为Spring框架的一个子项目,自其诞生以来就凭借其“约定大于配置”的理念和自动配置的特性,迅速在Java开发社区中获得了广泛的关注和认可。它简化了Spri…

QT 中ListView和ListWidget有什么区别

ListView和ListWidget在Qt框架中都是用于显示列表数据的控件&#xff0c;但它们在使用方法和特性上存在一些明显的差异。以下是关于它们用法不一样的地方的详细分析&#xff1a; 数据管理方式&#xff1a; ListView&#xff1a;使用QAbstractItemModel数据模型来管理和显示列表…

electron录制应用-自由画板功能

功能 录屏过程中的涂画功能允许用户在录制屏幕操作的同时&#xff0c;实时添加注释和高亮显示&#xff0c;以增强信息的传达和观众的理解。 效果 electron录制-添加画布 代码实现 1、利用HTML5的Canvas元素实现一个自由涂画的功能&#xff0c;允许用户在网页上进行手绘创作。…

笔记本电脑屏幕模糊?6招恢复屏幕清晰!

在数字化时代的浪潮中&#xff0c;笔记本电脑已成为我们生活、学习和工作中不可或缺的一部分。然而&#xff0c;当那曾经清晰明亮的屏幕逐渐变得模糊不清时&#xff0c;无疑给我们的使用体验蒙上了一层阴影。屏幕模糊不仅影响视觉舒适度&#xff0c;更可能对我们的工作效率和眼…

【AI大模型】驱动的未来:穿戴设备如何革新血液、皮肤检测与营养健康管理

文章目录 1. 引言2. 现状与挑战3. AI大模型与穿戴设备概述4. 数据采集与预处理4.1 数据集成与增强4.2 数据清洗与异常检测 5. 模型架构与训练5.1 高级模型架构5.2 模型训练与调优 6. 个性化营养建议系统6.1 营养建议生成优化6.2 用户反馈与系统优化 7. 关键血液成分与健康状况评…

WIN Semis揭幕耐湿砷化镓pHEMT技术

​犹如为无线通信领域注入了一股清新的活力。这项技术不仅支持E频带&#xff0c;更在晶圆级上筑起了一道坚固的防潮屏障&#xff0c;满足了对严苛环境条件的bHAST挑战。今日&#xff0c;WIN半导体公司正式公布了0.1m pHEMT技术PP10-29的测试版&#xff0c;预示着通信领域的新篇…

React学习(一)

React的详细解析: 1. React的起源与背景 React起源于Facebook的内部项目&#xff0c;旨在解决市场上JavaScript MVC框架的不足之处。React的早期原型被称为“FaxJS”&#xff0c;由Facebook工程师Jordan Walke开发&#xff0c;深受XHP&#xff08;一个简单的PHP HTML组件框架…

ansible 任务块以及循环

任务块 可以通过block关键字&#xff0c;将多个任务组合到一起可以将整个block任务组&#xff0c;一起控制是否要执行 # 如果webservers组中的主机系统发行版是Rocky&#xff0c;则安装并启动nginx [rootpubserver ansible]# vim block1.yml --- - name: block tasks hosts…

墨刀原型工具-小白入门篇

墨刀原型工具-小白入门篇 简介 随着互联网的发展和用户体验的重要性越来越受到重视&#xff0c;原型设计逐渐成为了产品设计中的重要环节。墨刀作为一款原型设计工具&#xff0c;以其简洁、易用的特点&#xff0c;受到了很多设计师的喜爱。本文将介绍墨刀原型工具的基本使用方…

ROS2从入门到精通4-4:局部控制插件开发案例(以PID算法为例)

目录 0 专栏介绍1 控制插件编写模板1.1 构造控制插件类1.2 注册并导出插件1.3 编译与使用插件 2 基于PID的路径跟踪原理3 控制插件开发案例(PID算法)常见问题 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底层基本分布式原理&#xff0c;并具有机器人建模和…

Go 如何使用指针灵活操作内存

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Leetcode 3196. Maximize Total Cost of Alternating Subarrays

Leetcode 3196. Maximize Total Cost of Alternating Subarrays 1. 解题思路2. 代码实现 题目链接&#xff1a;3196. Maximize Total Cost of Alternating Subarrays 1. 解题思路 这一题就是一个动态规划&#xff0c;只需要考虑每一个元素作为开始和处于序列当中的二元态即可…

深度学习引言

深度学习引言 什么是神经网络&#xff1f; 我们常常用深度学习这个术语来指训练神经网络的过程。有时它指的是特别大规模的神经网络训练。 神经网络的监督学习 关于神经网络也有很多的种类&#xff0c;考虑到它们的使用效果&#xff0c;有些使用起来恰到好处&#xff0c;但事实…