常用排序,快速排序,归并排序算法讲解

news2024/9/24 11:23:13

文章目录

      • 快速排序
      • 归并排序

排序有很多种算法,常听的十大排序有:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序、希尔排序、计数排序、基数排序、桶排序。

这里只介绍两个常用的算法。

排序:

  1. 快速排序
  2. 归并排序

你可能想知道什么时候该用哪个:

快速排序使用场景:快速排序平均时间复杂度为O(n log n),最坏情况下为O(n²),不太稳定,但优点是不占用额外空间,快速排序为原地排序。 在实践中,快速排序通常优于其他时间复杂度为 O(n log n) 的算法,

归并排序使用场景:时间复杂度为O(n log n)。无论情况好坏都相对稳定。优点是稳定,但需要占用额外的O(n)空间。


快速排序

思路:选择一个基准元素,将所有小于基准的元素放置在其左侧,将所有大于基准的元素放置在其右侧。这种操作称为“分区”。然后分别对基准左侧和右侧的两个子元素执行相同的操作。

现在开始快速排序的基本步骤思路:

1: 数据数组

在这里插入图片描述
2: 选择基准

在这里插入图片描述

3: 设置左边界和右边界

在这里插入图片描述
4: 如果右边界小于基准值,则调换左边界和右边界的值,接着左边界i++,随后右边界j++(如果循环未结束)。否则仅j++

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

如果不理解,请仔细阅读第四标题的内容:如果右边界小于基准值,则调换左边界和右边界的值,接着左边界i++,随后右边界j++(如果循环未结束)。否则仅j++

5: 循环结束后,交换左边界和基准的值

在这里插入图片描述

6: 根据基准,截取两部分的值

在这里插入图片描述
7:将左右两部分分别执行 1-6 的步骤

在这里插入图片描述

JavaScript实现代码:

function myQuickSort(array, left = 0, right = array.length - 1) {
    if (left < right) {
        // 获取分区后枢轴的位置
        let pivotIndex = pivotIndexMeth(array, left, right)
        // 递归调用
        myQuickSort(array, left, pivotIndex - 1)
        // 递归调用
        myQuickSort(array, pivotIndex + 1, right)
    }
    return array
}

function pivotIndexMeth(array, left, right) {
    // 使用最右边的元素作为枢轴
    let pivot = array[right]
    // 从左边开始
    let i = left;
    // 遍历数组
    for (let j = left; j < right; j++) {
        // 如果元素小于枢轴,就交换它和当前的“i”元素
        if (array[j] < pivot) {
            [array[i], array[j]] = [array[j], array[i]]
            i++
        }
    }
    // 最后,将枢轴放置在正确的位置
    [array[i], array[right]] = [array[right], array[i]]
    // 返回枢轴的位置
    return i;
}

console.log(myQuickSort([7, 2, 3, 1, 6, 8, 4, 5]))

归并排序

思路:将一个大列表分成两个较小的子列表,然后分别对两个子列表进行排序,最后将两个已排序的子列表合并为一个完整的排序列表。

现在开始归并排序的基本步骤思路:

1: 数据数组

在这里插入图片描述

2: 求出中心点,分割数据

在这里插入图片描述
3: 将分割后的数据继续分割

在这里插入图片描述

4: 将分割后的数据继续分割

在这里插入图片描述
5: 直至分割成一个单位长度的数组之后,进行大小对比排序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

JavaScript实现代码:

function myMergeSort(array) {
    // 获取数组长度
    let len = array.length;
    // 如果数组长度小于2,返回
    if (len < 2) {
        return array;
    }
    // 获取中间值
    let middle = Math.floor(len / 2)
    // 获取左边的数组
    let left = array.slice(0, middle)
    // 获取右边的数组
    let right = array.slice(middle)
    // 递归调用
    return merge(myMergeSort(left), myMergeSort(right))
}

function merge(left, right) {
    // 定义一个数组
    let result = [];
    // 如果左边和右边的数组都有值
    while (left.length && right.length) {
        // 如果左边的第一个值小于右边的第一个值
        if (left[0] < right[0]) {
            // 将左边的第一个值放入数组
            result.push(left.shift())
        } else {
            // 将右边的第一个值放入数组
            result.push(right.shift())
        }
    }
    // 如果左边的数组有值
    while (left.length) {
        result.push(left.shift())
    }
    // 如果右边的数组有值
    while (right.length) {
        result.push(right.shift())
    }
    return result;
}

console.log(myMergeSort([7, 2, 3, 1, 6, 8, 4, 5]))

如果解释有误或需要补充,感谢您指正。

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

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

相关文章

python安装cartopy

1.安装cartopy 创建新环境&#xff1a;https://www.machinelearningplus.com/deployment/conda-create-environment-and-everything-you-need-to-know-to-manage-conda-virtual-environment/ conda create --name mlenv python3.7.5 激活环境后&#xff0c;安装cartopy包&#…

IDEA+springboot+mybatis+shiro+bootstrap+Mysql网上书店管理系统源码

IDEAspringbootmybatisshirobootstrapMysql网上书店管理系统 一、系统介绍1.环境配置 二、系统展示1. 首页2.图书详情3.登录4. 注册5. 购物车6. 个人信息7.我的订单8.填写订单9.用户管理10.添加用户11.店铺列表12.添加店铺13.角色列表14.添加角色15.权限管理16.店铺信息17.我的…

十、SkyWalking链路追踪

解决什么问题&#xff1f; 串联整个调用链路&#xff0c;快速定位问题。缕清服务之间的依赖关系。对各个微服务接口的进行性能分析。跟踪整个业务流程的调用处理顺序。 一、skywalking介绍 1、skywalking是什么&#xff1f; skywalking是一个国产开源框架&#xff0c;2015年…

wordpress 单页中子页面列表制作方法

一、目标&#xff1a; 1、父页面显示所有子页面&#xff0c;如果是子页面就显示子页面对应父页面下的所有子页面。 2、选中的子页面链接显示不一样的样式。 二、代码 <?php$current_page_id get_the_ID(); // 获取当前页面的ID// 判断当前页面是否为父页面$is_parent_…

[数据结构 -- 手撕排序第三篇] 冒泡排序

目录 1、常见的排序算法 1.1 交换排序基本思想 2、冒泡排序的实现 2.1 基本思想 2.2 单趟排序 2.2.1 单趟排序分析 2.2.2 单趟排序实现代码 3、冒泡排序完整代码实现 3.1 思路分析 3.2 代码实现 4、时间复杂度 5、优化算法 5.1 优化算法思路 5.2 优化算法代码实现…

【Linux网络】网络基础(一)

Linux网络基础 1 网络背景1.1 网络发展1.2 局域网和广域网 2 认识“协议”2.1 网络协议分层&#xff08;高内聚&#xff0c;低耦合思想&#xff09;2.1.1 高内聚&#xff0c;低耦合简单理解2.1.2 协议分层的简单例子 3 OSI七层模型3.1 TCP/IP五层&#xff08;或四层&#xff09…

前端LayUI框架快速上手实现登入注册

目录 一、Layui简介 1. 什么是LayUI 2. LayUI的特点 二、LayUI入门 1. LayUI下载 2. LayUI入门使用 1. 在web项目中导入LayUI文件中的layui文件 2. 在JSP页面引入css、js文件 3. 制作一个简单的猜字游戏 4.效果展示 三、Layui实现简单登入功能 环境搭建 一、Layui简…

spring boot+MySQL实现班级综合测评管理系统

随着电子技术的普及和快速发展&#xff0c;线上管理系统被广泛的使用&#xff0c;有很多事业单位和商业机构都在实现电子信息化管理&#xff0c;班级综合测评管理也不例外&#xff0c;由比较传统的人工管理转向了电子化、信息化、系统化的管理。 传统的班级综合测评管理系统&am…

运维工具的学习(1)--Curl

1.1 curl简介 ​Curl是一个非常实用的、用来与服务器之间传输数据的工具&#xff1b;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP)&#xff0c;curl设计为无用…

Kafka入门,offset的默认维护位置(二十一)

offset的默认维护位置 0.9版本之前&#xff1a;consumer默认将offset保持在zookeeper中 从0.9版本开始&#xff0c;consumer默认将offset保存在kafka一个内置的topic中&#xff0c;该topic为__consumer_offsets __consumer_offsets 主题里面采用key和value方式存储数据&#x…

【谷粒学院】NUXT框架

一、服务端渲染技术NUXT 1、什么是服务端渲染 服务端渲染又称SSR (Server Side Render)是在服务端完成页面的内容&#xff0c;而不是在客户端通过AJAX获取数据。 服务器端渲染(SSR)的优势主要在于&#xff1a;更好的 SEO&#xff0c;由于搜索引擎爬虫抓取工具可以直接查看完全…

【分布式应用】ELK 企业级日志分析系统

目录 一、ELK概述1.1、ELK 简介1.2 为什么要使用 ELK1.3完整日志系统基本特征1.4 ELK 的工作原理 二、ELK Elasticsearch 集群部署2.1环境准备2.2&#xff0e;部署 Elasticsearch 软件2.3安装 Elasticsearch-head 插件&#xff08;1&#xff09;编译安装 node&#xff08;2&…

任务六:LTE-Advanced 关键技术

LTE-Advanced 关键技术 一、载波聚合&#xff08;Carrier aggregation&#xff0c;CA&#xff09;二、多天线增强&#xff08;Enhanced Multiple Antenna Transmission&#xff09;1、上行多天线增强2、下行多天线增强。 三、协作多点传输&#xff08;Coordinated Multiple Poi…

buu刷题Reverse总结

[FlareOn1]Bob Doge 是一个C#编写的程序&#xff0c;在dnspy中打开&#xff0c;找到主函数&#xff0c;可以看到大致逻辑 不知道dat_secret的值&#xff0c;动态调试看看 DnSpy动态调试&#xff1a; 在主函数中添加断点&#xff0c;调试&#xff0c;因为本题的fag形式为&…

spring 自带的校验框架使用

引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>编写规则 开启校验

springboot+mysql财务管理系统

财务管理系统的开发运用java技术、springboot框架&#xff0c;MIS的总体思想&#xff0c;以及Mysql等技术的支持下共同完成了该系统的开发&#xff0c;实现了财务管理的信息化&#xff0c;使员工体验到更优秀的财务管理&#xff0c;管理员管理操作将更加方便&#xff0c;实现目…

消息队列篇面试题

一、MQ基础 1.1、为什么使用MQ&#xff1f;MQ的优点 简答 异步处理 - 相比于传统的串行、并行方式&#xff0c;提高了系统吞吐量。 应用解耦 - 系统间通过消息通信&#xff0c;不用关心其他系统的处理。 流量削锋 - 可以通过消息队列长度控制请求量&#xff1b;可以缓解短时间…

(vue)vue项目实现语音播报

(vue)vue项目实现语音播报 解决参考1&#xff1a; 在 Vue 项目中&#xff0c;你可以使用 Web Speech API 中的 SpeechSynthesis 接口来实现文本内容的自动朗读。下面是一个示例&#xff1a; 1.在 Vue 组件的模板中添加一个按钮&#xff0c;用于触发朗读&#xff1a; <templa…

Appium+python自动化(二)- 环境搭建—下(超详解)

简介 上一篇android测试开发环境已经准备好&#xff0c; 那么接下来就是appium的环境安装和搭建了。 环境装好后&#xff0c;可以用真机连电脑&#xff0c;也可以用android-sdk里面的模拟器&#xff08;当然这个模拟器不是很好用&#xff09;&#xff0c;我一般喜欢真机&#…

【QT】——布局

目录 1.在UI窗口中布局 2.API设置布局 2.1 QLayout 2.2 QHBoxLayout 2.3 QVBoxLayout 2.4 QGirdLayout 注意 示例 Qt 窗口布局是指将多个子窗口按照某种排列方式将其全部展示到对应的父窗口中的一种处理方式。在 Qt 中常用的布局样式有三种&#xff0c;分别是&#xff1…