算法--排序算法效率比较

news2024/11/17 19:41:22

《算法设计与分析》课程实验报告 ( 实验一)

实验名称:排序算法效率比较

实验地点

所使用的开发工具及环境:   PC机,DEV++

一、实验目的:

比较至少 4 种排序(从小到大排)算法的执行效率。已学过的算法:冒泡排序、选择排序、插入排序、shell 排序,归并排序、快速排序等。  

二、基本思想、原理和算法描述:

本次实验中使用到的冒泡排序、选择排序、插入排序、快速排序四种排序算法,它们的基本思想、原理和算法描述如下:

(1)冒泡排序:

重复遍历数组,每次遍历将当前最大的元素冒泡到最后。对于未排序部分,从数组首元素开始,依次比较相邻的两个元素。

(2)选择排序:

对于未排序部分,从数组首元素开始,逐个选择最小(或最大)的元素。将选出的最小(或最大)元素与未排序部分的首元素交换位置,将其放到已排序部分。重复上述步骤,直到全部排序完成。

(3)插入排序:

将数组分为已排序和未排序两部分,初始时已排序部分只包含一个元素(即数组的第一个元素)。从未排序部分选择一个元素,将它插入到已排序部分的正确位置,使已排序部分仍然有序。重复上述步骤,直到未排序部分为空。

(4)快速排序:

选择一个基准元素,一般选择数组的最后一个元素。将比基准小的元素移到左侧,比基准大的元素移到右侧。可以使用双指针或单指针的方式进行分区操作。对基准元素左右的两个分区分别进行递归快速排序。重复上述步骤,直到每个分区只包含一个元素或为空。

(5)归并排序:

分割:将待排序的数组分割为两个子数组,找到数组的中间位置 mid = (left + right)/2,其中 left 表示数组的起始位置,right 表示数组的终止位置。

递归排序:对左右两个子数组分别递归调用归并排序函数 mergeSort,将其分割为更小的子数组,并进行排序。

合并:将排好序的左右两个子数组按照大小顺序合并到原始数组中。为此,需要创建一个临时数组 temp,用来存储合并后的结果。设置三个指针:i 指向左子数组的起始位置,j 指向右子数组的起始位置,k 指向临时数组的起始位置。比较左右两个子数组的元素大小,将较小的元素放入临时数组,并将指针向后移动。重复这个过程,直到其中一个子数组的元素全部放入临时数组。将剩余的子数组中的元素直接拷贝到临时数组中,最后将临时数组的元素复制回原始数组相应的位置。

三、实验内容

1、随机产生 50000+个数据,并保存至文件 test 中。

核心代码:

2、至少编写 4 种排序算法。

(1)冒泡排序:

(2)插入排序:

(3)选择排序:

(4)快速排序:

(5)归并排序:

3、调用步骤 2 中编写的程序,并从 test 中读取数据并排序,输出从读取到排好序,总共需要的时间。

4、结合时间复杂度,验证并分析几种排序算法的优劣。

(1)冒泡排序(Bubble Sort)的时间复杂度为O(n^2)

2)选择排序(Selection Sort)的时间复杂度也为O(n^2)

3)插入排序(Insertion Sort)的时间复杂度也为O(n^2)

4)快速排序的平均时间复杂度为O(nlogn)

5)归并排序的平均时间复杂度为O(nlogn)

在上述实验中测试的数据时间从大到小的排序是:选择>插入>冒泡>快速>归并。所以,综上所述,快速排序和归并排序不论是从时间复杂度来讲还是实际操作中所用的时间来说,都要比其他(实验中的的选择排序,插入排序,冒泡排序)算法来讲,都要好得多。

5、如果随机生成的数据是基本有序,或者是有序,或者是反序时,运行结果会怎么样?怎样解决这种问题,试提出你的解决方法。

冒泡排序、选择排序和插入排序的性能会受到较大影响,而快速排序在不同数据情况下的性能相对更为稳定。

归并排序在任何情况下都能保持稳定的O(n log n)时间复杂度,因此在基本有序、有序或反序的情况下,性能都相对稳定。

解决这种问题的方法之一是通过检测数据的有序程度,在数据已经有序或接近有序的情况下,采用更适合的排序算法以提升性能。

四、程序运行结果分析。

就之前的实验步骤中的操作来说,选择>插入>冒泡>快速>归并是此次实验的结论,快速排序和归并排序不论是从时间复杂度来讲还是实际操作中所用的时间来说,都要比其他实验中的选择排序,插入排序,冒泡排序算法来讲,都要好得多,但是归并排序不会受数据顺序的影响,在所有情况下都很稳定。并且冒泡排序、选择排序和插入排序的性能会受到较大影响,而快速排序在不同数据情况下的性能相对更为稳定。

五、实验总结

此次实验比较至少 5 种排序算法的执行效率,分别将冒泡排序、选择排序、插入排序、快速排、归并排序,五种算法进行比较。增强了我们的动手能力和编程能力,以及将算法进行实际应用的能力。

                                        

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

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

相关文章

从十月稻田,看大米为何能卖出200亿市值?

国无农不稳,民无粮不安。新时代的农村农民,需要现代化的农业作依托,而在农业现代化的过程中,品牌化、数字化成为至关重要的一环。 金秋十月,从南到北,从东到西,中国农村的每一块土地都洋溢着丰…

【运筹优化】运筹学导论:线性规划导论

文章目录 一、原形范例(Wyndor Glass 公司)1.1 线性规划模型构建1.2 图解法1.3 结论 二、线性规划模型2.1 线性规划模型的标准形式2.2 其他形式2.3 模型解的术语 三、有关线性规划的假设3.1 比例性3.2 可加性3.3 可分割性3.4 确定性 四、补充例子4.1 放射…

ant的basedir内置属性

basedir是ant的内置属性,代表项目基础路径的绝对路径。它的默认值等于build文件的父目录。当然,可以通过project 的basedir 属性、或者单独的basedir 属性来覆盖。 例如,在工程的根目录下有个build.xml文件: build.xml文件的内…

java springboot 实现 对象或对象数组 转为 前端可解析的JSON字符串格式

这是我的接口代码 逻辑就是 通过 IBookService对象中的 list 函数获取数据列表 然后定义 state(响应状态) message(提示信息) 最后将这三个信息 做成对象返回给前端 接口访问结果 但是这种对象数组对存储空间消耗肯定是比字符串大很多的 所以 我们来尝试 将json数组转成字符…

JOSEF约瑟 漏电继电器 JHOK-ZBG1 φ25mm AC220V 0.1A/0.1S 分体式

系列型号 JHOK-ZBG1 φ25mm漏电(剩余)继电器 JHOK-ZBG2 φ25mm漏电(剩余)继电器 JHOK-ZBG1 φ45mm漏电(剩余)继电器 JHOK-ZBG2 φ45mm 漏电(剩余)继电器 JHOK-ZBG1 φ100mm漏电&a…

广西建筑模板厂家批发——能强优品木业

随着建筑业的蓬勃发展,建筑模板作为不可或缺的基础材料,在工程施工中扮演着重要的角色。在广西,能强优品木业有限公司作为一家备受瞩目的建筑模板厂家批发商,以其卓越的产品品质和优质的服务在行业中脱颖而出。 实力厂家扎根广西 …

电影《前任4:英年早婚》观后感

刚刚国庆节后,没有什么上新电影,只能看国庆节时的电影了,于是选择了这部《前任4:英年早婚》,原本是非常抗拒看这样的电影了,毕竟自己作为单身狗,还是不喜欢吃狗粮的,不过从另一方面讲…

JOSEF约瑟 轨道继电器 CSN-11 DC220V 二转换 35mm导轨安装 大功率启动大于5W

CSN-11轨道继电器 一、用途 该继电器用于电力系统接口设备可与保护装置,安全自动装置等设备接口实现开入隔离,开出重动功能,用于开关量的隔离及转换。CSN-11继电器特点是启动功率大抗力强。采用标准35mm导轨安装。 二、技术参数 1.额定电…

C++算法:给表达式添加运算符

题目 给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)、- 或 * ,返回 所有 能够得到 target 的表达式。 注意,返回表达式中的操作数 不应该 包含前导零。…

行情分析——加密货币市场大盘走势(10.18)

大饼昨日小幅度的下跌回调了,很快又上涨。目前看下来震荡向下刚刚开始,可以关注后续情况。大饼依然保持看空不做空,目前除了独立行情的币,就大饼非常强势。目前从MACD日线来看,还是保持多头趋势,预计明后两…

6-2 进制转换 分数 10

Status SPush(SqStack& s, ElemType x) {if (s.top s.stacksize) //栈满return ERROR;s.data[s.top] x;s.top;//1条或2条语句均可return OK; } Status SPop(SqStack& s, int& e) {if (s.top 0) //栈空return ERROR;s.top--; //S.top下移e s.data[s.top]; //把…

WhatsApp 私域营销指南

当涉及到WhatsApp私域营销时,企业正逐渐意识到这个强大工具的潜力,为建立与用户之间更紧密的关系、提供个性化的服务和推广,以及增加用户忠诚度, WhatsApp已成为一个不可或缺的营销渠道。在如今竞争激烈的市场中,私域营…

SSTI模板注入(flask) 学习总结

文章目录 Flask-jinja2 SSTI 一般利用姿势SSTI 中常用的魔术方法内建函数 利用 SSTI 读取文件Python 2Python 3 利用 SSTI 执行命令寻找内建函数 eval 执行命令寻找 os 模块执行命令寻找 popen 函数执行命令寻找 importlib 类执行命令寻找 linecache 函数执行命令寻找 subproce…

腾讯待办将全面停止运营?关停后有什么其他的好用待办软件推荐

微信是很多用户的手机上必下载的软件。在微信中,可以使用各种各样的功能,其中就包括小程序。在微信小程序中,有不少用户都在使用腾讯待办这款工具,它可以记录待办事项,打钩标记完成,还能通过公众号接收待办…

LeetCode26——删除有序数组中的重复项

LeetCode26——删除有序数组中的重复项 自己的暴力解(假设可以使用额外的空间): 时间复杂度:O(N) 空间复杂度:O(N) package keepcoding.leetcode.leetcode26; /*给你一个 非严格递增排列 的数组 nums ,请…

MySql 数据库基础概念,基本简单操作及数据类型介绍

文章目录 数据库基础为什么需要数据库?创建数据库mysql架构SQL语句分类编码集修改数据库属性数据库备份 表的基本操作存在时更新,不存在时插入 数据类型日期类型enum和set 数据库基础 以特定的格式保存文件,叫做数据库,这是狭义上…

水浸监测新方法,简单实用,你值得拥有!

随着科技的不断进步,监控系统已成为我们生活中不可或缺的一部分。然而,许多监控系统在面临水浸等自然灾害时显得无能为力,这可能导致严重的损失和危险。 因此,水浸监控系统的需求不断增加,以保护我们的财产和安全。 客…

用户标签管理系统怎么设计?用户标签系统应用场景介绍

随着市场竞争日益激烈,企业对于流量的需求也越来越大。然而,“公域流量”的成本不断攀升,企业难以承担,且转化方式往往是“一次性生意”,无法沉淀为企业自己的数据,因此企业开始转向私域流量的培养。但私域…

满分漏洞!思科未修补的零日漏洞正被积极利用

该漏洞允许攻击者在未进行身份验证的情况下远程获得受影响设备的全部管理员权限。 思科要求客户立即在其所有面向互联网的 IOS XE 设备上禁用 HTTPS 服务器功能,以防止攻击者利用操作系统 Web 用户界面中的一个关键零日漏洞。 思科 IOS XE 是思科用于下一代企业网络…