选择排序、归并排序、快速排序

1.选择排序

选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排序区间。但是选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾。

Java代码实现如下。

ps:选择排序的最好情况时间复杂度、最坏情况和平均情况时间复杂度都为 O(n2),同时选择排序不是稳定的排序算法,选择排序只需要常量的内存空间消耗所以是原地排序算法。

2.归并排序(Merge Sort)

我们先看看归并排序的实现思路

1.先将需要比较的数组从中间进行拆分前后两部分,然后将拆完后的继续拆分成前后两部分,直到不能拆分为止,图中并非完全拆好后结果,只是第一步。

2.将每次拆分的前后两部分分别进行排序

首先我们用两个游标i和j来分别指向前部分的第一个数据和后部分的一个数据,然后比较前部分的第一个数据和后一个的第一个数据,如果前部分的第一个比后部分的第一个小,那么就将前部分的一个放入新的数组中,同时前部分游标向后移动,也就是i++,否则就是将后部分的第一个数据放入到新数组中,同时后部分游标向后移动,也就是j++。直到i和j的值为数组长度时结束。

ps:那么如果前部分已经全部放入新数组中,而后部分还有没有放入新数组中的怎么办呢?我们直接将没有放入新数组中的数据依次放入即可.

3.最后将排好序的前后部分进行合并

合并我们需要借助另一个数组来实现,也就是一个和排序数组长度相同的数组,每个分治排序后的数据都是放在新数组中,同时将新数组中的值拷贝到原数组中,使原数组中分治的左右两边都是有有序的.

Java代码实现如下。

ps:归并排序的时间复杂度为 O(nlogn),同时归并排序是稳定的排序算法,归并排序需要一个和排序数组一样大的新数组,内存空间为O(n),所以不是原地排序算法。

3.快速排序

我们来看看快速排序的实现原理,首先给数组找一个基准数,一般选择首或者尾,然后用两个游标来指向数组两头,用尾部j比较基准数k,如果基准数小于j,则j向左移动,若基准数大与j,那么j不动,同时i开始比较基准数,如果基准数大于i那么i向右移动,若基准数小于i那么此时i和j交换数据,交换后j继续比较基准数,直到最后i和j相遇时,将基准数和j互换。

然后把i的位置移动到k,缩小范围,继续将基准数k的左边变为都是小于他的数,右边都是大于他的数,数组左边全部完成后把基准数变为数组右半边第一位,继续把基准数小的移动到左边,大的在基准数右边。

Java代码实现如下。

ps:快速排序时间复杂度绝大多数都是O(nlogn),但是如果数组中的数据原来已经是有序的了,比如 1,3,5,6,8。如果我们每次选择最后一个元素作为基准数,那每次分区得到的两个区间都是不均等的。我们需要进行大约 n 次分区操作,才能完成快排的整个过程。每次分区我们平均要扫描大约 n/2 个元素,这种情况下,快排的时间复杂度就从 O(nlogn) 退化成了 O(n2)。同时快速排序不是稳定的排序算法,快速排序只需要常量的内存空间消耗所以是原地排序算法。

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

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

相关文章

PAX-DV-D24-1带升压双比例阀放大器

驱动比例流量阀、比例压力阀及泵、双比例控制阀; 双通道相互独立,PWM输出,发热小; 电流负反馈恒流输出,精密采样,温度漂移小于0.5%; 内部可选带升压,满足大阻抗线圈输出; 重复精度高,线性度…

Debezium系列之:基于debezium将mysql数据库数据更改流式传输到 Elasticsearch和PostgreSQL数据库

Debezium系列之:基于debezium将mysql数据库数据更改流式传输到 Elasticsearch和PostgreSQL数据库 一、背景二、技术路线三、配置四、从mysql同步数据到Elasticsearch和PostgreSQL数据库五、总结 一、背景 基于 Debezium 的端到端数据流用例,将数据流式传…

SpringMVC 中的视图如何渲染模型数据

SpringMVC 中的视图如何渲染模型数据 SpringMVC 是一个基于 Spring 框架的 Web 框架,它提供了一种方便的方式来处理 HTTP 请求和响应。在 SpringMVC 中,视图是用来渲染模型数据的组件,它们负责将模型数据转换为 HTML、JSON、XML 等格式的响应…

Flink DataStream之Union合并流

新建类 package test01;import jdk.nashorn.internal.runtime.regexp.joni.Config; import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.configuration.Configuration; import org.apache.flink.streaming.api.datastream.DataStream; import o…

UNION 和 UNION ALL 用法及区别

UNION UNION 是一个用于合并多个 SELECT 查询结果的操作符。它的作用是将多个查询的结果集合并为一个结果集,并去除重复的行。 主要特点和作用如下: 合并结果集:UNION 操作符可以将多个查询的结果集合并为一个结果集。每个查询的结果集必须…

使用Llama.cpp在CPU上快速的运行LLM

大型语言模型(llm)正变得越来越流行,但是它需要很多的资源,尤其时GPU。在这篇文章中,我们将介绍如何使用Python中的llama.cpp库在高性能的cpu上运行llm。 大型语言模型(llm)正变得越来越流行,但是它们的运行在计算上是非常消耗资源…

干了4年外包,技术落后得明显,感觉要被行业优化了

先说一下自己的情况。大专生,19年通过校招进入深圳某软件公司,干了接近4年的测试,今年年中旬,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了4年,…

Django实现简单的音乐播放器 1

使用django框架开发一个简单的音乐播放器。 效果: 目录 环境准备 安装django 创建项目 创建应用 注册应用 配置数据库 设置数据库配置 设置pymysql库引用 创建数据库 创建数据表 生成表迁移文件 执行表迁移 配置时区 配置语言 配置子应用路由 在pla…

WHERE条件和ON条件的区别

目录 总结: 1.inner join方式关联 2.left join方式关联 实例 1.建表 2.left join 主表的on和where条件 3.left join 关联表的on和where条件 总结: 1.inner join方式关联 on条件(无论是对主表字段的限制还是对关联表字段的限制&#…

Python实现PSO粒子群优化算法优化LightGBM分类模型(LGBMClassifier算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法(Particle Swarm Optimization)的英文缩写,是一…

代码随想录算法训练营 个人总结

训练营周期:2023/5/10 - 7/8,共计60天 LeetCode记录: 参加训练营之前,就有想刷LeetCode的想法,一方便没有头绪地不知道按什么顺序刷题,另一方面也没有找到很好的讲解材料,都是自己看LeetCode页面…

瑞芯微 RK356x 基于Android11移植usb接口rtl8723du wifi和蓝牙一体化

开发环境 平台: 瑞芯微RK356x 操作系统:Android11 WiFi、蓝牙芯片:RTL8723DU 通讯类型:USB协议 RTL8723du介绍 Realtek RTL8723DU是一个高度集成的单片机802.11b/g/n 1T1R WLAN,和一个集成的蓝牙2.1/4.2单片机,USB 2.0多功能。…