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

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

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

实验地点

所使用的开发工具及环境:   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.rhkb.cn/news/163534.html

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

相关文章

大数据Flink(九十七):EXPLAIN、USE和SHOW 子句

文章目录 EXPLAIN、USE和SHOW 子句 一、EXPLAIN 子句 二、USE 子句

Ruby和面向对象技术

Ruby和许多极为流行的编程语言都是面向对象的。多数的面向对象编程语言,每个对象都是一个样例或者既定类的实例以及独立对象的行为。 一、创建一个通用对象 创建一个通用对象 obj Object.new定义通用对象的行为 def obj.talk puts "I am an object"p…

VMware——VMware17安装WindowServer2012R2环境(图解版)

目录 一、WindowServer2012R2镜像百度云下载二、安装 一、WindowServer2012R2镜像百度云下载 下载链接:https://pan.baidu.com/s/1TWnSRJTk0ruGNn4YinzIgA 提取码:e7u0 二、安装 打开虚拟机,点击【创建新的虚拟机】,如下图&…

直接插入排序

排序——先写单个——再衍生到整体 单个插入排序——在插入前数组里面的数是有序的,然后来了一个数据,就要用这个数组从后往前和这个数比较, 整体的话就是,end从0开始,循环n-1次 void TnsertSort(int* a,int n) {in…

SpringCloud: sentinel链路限流

一、配置文件要增加 spring.cloud.sentinel.webContextUnify: false二、在要限流的业务方法上使用SentinelResource注解 package cn.edu.tju.service;import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockExcept…

【Python】文件操作

一、文件的编码 思考:计算机只能识别:0和1,那么我们丰富的文本文件是如何被计算机识别,并存储在硬盘中呢? 答案:使用编码技术( 密码本)将内容翻译成0和1存入 编码技术即:翻译的规则,记录了如何将内容翻译成二进制,以及如何将二…

nginx平滑升级添加echo模块、localtion配置、rewrite配置

nginx平滑升级添加echo模块、location配置、rewrite配置 文章目录 nginx平滑升级添加echo模块、location配置、rewrite配置1.环境说明:2.nginx平滑升级原理:3.平滑升级nginx,并添加echo模块3.1.查看当前nginx版本以及老版本编译参数信息3.2.下…

【MyBatis】MyBatis日志信息配置

目录 什么是MyBatis相关的日志? 标准日志信息配置: 配置logback日志信息: 什么是MyBatis相关的日志? 首先什么叫做与MyBatis相关的日志呢?就是我们在执行sql语句的时候,如果没有MyBatis相关的日志&…

TX Text Control.NET 32.0 For WPF

TX Text Control 支持VISUAL STUDIO 2022、.NET 5 和 .NET 6 支持 .NET WPF 应用程序的文档处理 将文档编辑、创建和 PDF 生成添加到您的 WPF 应用程序中。 视窗用户界面 功能齐全的文档编辑器 TX Text Control 是一款完全可编程的丰富编辑控件,它在专为 Visual Stu…

基于java的校园论坛系统,ssm+jsp,Mysql数据库,前台用户+后台管理,完美运行,有一万多字论文

目录 演示视频 基本介绍 论文目录 功能架构 系统截图 演示视频 基本介绍 基于java的校园论坛系统,Mysql数据库,系统整体采用ssmjsp设计,前台用户后台管理,完美运行,有一万多字论文。 用户功能: 1.系统…

DVWA-impossible代码审计

文章目录 DVWA靶场—impossible代码审计1.暴力破解(Brute Force)1.1 代码审计1.2 总结 2.命令注入(Command Injection)2.1 代码审计2.2 总结 3.跨站请求伪造(CSRF)3.1 代码审计3.2 总结 4.文件包含漏洞&…

二叉搜索树的详解及Map和Set的介绍

目录 1.二叉搜索树 1.1二叉搜索树的介绍 1.2.二叉搜索树的实现 1.2.1二叉搜索树的创建 1.2.2查找关键字 1.2.3插入 1.2.4删除 1.3二叉搜索树的性能分析 2.Map Map官方文档 2.1Map 的常用方法说明 2.2关于Map.Entry的说明,> 2.3注意事项 2.4reeMap和HashMap的区别 …

E054-web安全应用-Brute force暴力破解进阶

课程名称: E054-web安全应用-Brute force暴力破解进阶 课程分类: web安全应用 实验等级: 中级 任务场景: 【任务场景】 小王接到磐石公司的邀请,对该公司旗下的网站进行安全检测,经过一番检查发现该网站可能存在弱口令漏洞…

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

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

【交互式分割】——数据可视化

ritm, 交互式分割 数据可视化 数据包括一张图片 正样本点 负样本点 二分类的mask标签 如何模拟多次点击的迭代过程?

【计算机网络笔记】计算机网络性能(2)——时延带宽积、丢包率、吞吐量/率

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 系列文章目录时延带宽积丢包率吞吐量/率&am…

Systemverilog断言介绍(四)

3.3 SEQUENCES, PROPERTIES, AND CONCURRENT ASSERTIONS 3.3.1 SEQUENCE SYNTAX AND EXAMPLES 一个序列是在一段时间内发生的一组值的规范。构建序列所使用的基本操作是延迟规范器,形式为##n(表示特定数量的时钟)或##[a:b](表示…

分类预测 | MATLAB实现基于GRU-AdaBoost门控循环单元结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于GRU-AdaBoost门控循环单元结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于GRU-AdaBoost门控循环单元结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于GRU-AdaBoost门控循环单元结…

谷歌浏览器网页显示不完整解决方法

谷歌浏览器是非常多用户都在用的一款电脑软件,谷歌浏览器以启动速度快、浏览速度快、界面简单、极强的稳定性等优点受到大家的喜爱,在使用的时候,您可能会遇到打不开网页或显示不全等情况, 那么谷歌浏览器显示不完全怎么解决呢&am…

HTML 表单笔记/练习

表单 概述 表单用于收集用户信息,用户填写表单提交到服务器 一般传参方式: GETPOSTCookie 传参要素 传参方式 GETPOST 参数的名字目标页面内容的数据类型(只有在上传文件的时候) 提示信息 一个表单中通常还包含一些说明性的文…