数据结构算法-快速排序

2023-12-19

核心思路

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

快速排序算法核心思路

选择一个“基准”元素,将数组分为两个子数组,一个包含比基准小的元素,另一个包含比基准大的元素,然后对这两个子数组进行递归排序。

基准数

初始化两个索引 i 和 j,分别子数组的开头和结尾。
初始化基准元素 base 为子数组的第一个元素。
如果子数组的长度大于1,执行以下步骤:
通过循环移动指针 j 从右向左,直到找到一个小于基准的元素或达到 i 的位置。
如果找到一个小于基准的元素,将其与 i 指向的元素交换,并将 i 向右移动一位。
通过循环移动指针 i 从左向右,直到找到一个大于基准的元素或达到 j 的位置。
如果找到一个大于基准的元素,将其与 j 指向的元素交换,并将 j 向左移动一位。
将基准元素放到 i 的位置。
返回 i 的值,表示基准元素在排序后的数组中的位置。

快速排序步骤

首先检查 low 是否小于 higt,如果不是,则说明子数组的长度小于等于1,不需要排序,直接返回。
调用 findbaseNum 函数找到基准元素的位置 baseIndex。
递归调用 QuickSort 函数对基准元素左边的子数组进行排序。
递归调用 QuickSort 函数对基准元素右边的子数组进行排序。

快速排序算法专区

// 定义一个函数FindBaseNum,它接受一个整数数组arr和两个整数Low和High作为参数。  
int FindBaseNum(int arr[], int Low, int High) {  
  
    // 初始化两个索引,i子数组的起始位置,j子数组的结束位置。  
    int i = Low;  
    int j = High;  
  
    // 选取子数组的第一个元素作为"基准"(pivot),也称为"轴"元素。  
    int base = arr[Low];  
  
    // 检查子数组的长度,如果子数组只有一个或没有元素,那么就没有排序的必要。  
    if (Low<High){  
  
        // 当i小于j时,循环继续。这个循环是快速排序的关键步骤,它不断地将数组划分为两部分,一部分是小于基准的元素,另一部分是大于基准的元素。  
        while (i<j) {  
  
            // 在j指针逐渐向内移动的过程中,检查其是否指向了一个小于或等于基准的元素。如果是,则继续移动。这个步骤确保了所有大于基准的元素都位于其左侧。  
            while (i<j&& arr[j]>=base) {  
                j--;  
            }  
  
            // 如果i小于j,将当前j指向的元素与i指向的元素交换。这一步操作确保了所有小于基准的元素都位于其右侧。同时,由于i指针已经移动到了一个位置,所以我们需要将其增加1以便在下一次迭代中检查正确的位置。  
            if (i<j) {  
                arr[i++] = arr[j];  
            }  
  
            // 确保了所有小于基准的元素都位于其右侧。同时,由于我们已经知道所有大于基准的元素都位于其左侧,所以我们可以简单地移动i指针来查找正确的位置。  
            while (i < j && arr[i] < base) {  
                i++;  
            }  
  
            // 如果i小于j,将当前i指向的元素与j指向的元素交换。这一步操作确保了基准位于其最终的位置上。同时,由于j指针已经移动到了一个位置,所以我们需要将其减少1以便在下一次迭代中检查正确的位置。  
            if (i < j) {  
                arr[j--] = arr[i];  
            }  
        }  
          
        // 将基准放在其最终的位置上。此时,我们只需要对基准左侧和右侧的两个子数组进行相同的操作即可完成排序。  
        arr[i] = base;  
    }  
  
    // 返回基准的位置索引。  
    return i;  
}

// 定义一个函数QuickSort,它接受一个整数数组arr,以及两个整数low和higt作为参数。  
void QuickSort(int arr[], int low, int higt) {  
  
    // 如果low小于higt,则执行以下操作。这是递归的终止条件,意味着当low大于或等于higt时,数组已经被排序,不需要继续排序。  
    if (low<higt){  
          
        // 调用FindBaseNum函数来找到基准元素的索引。这个函数应该返回基准元素的位置。  
        int baseIndex = FindBaseNum(arr, low, higt);  
          
        // 对基准元素左边的子数组进行快速排序。  
        QuickSort(arr, low, baseIndex);  
          
        // 对基准元素右边的子数组进行快速排序。  
        QuickSort(arr, baseIndex + 1, higt);  
    }  
}

优化版,函数指针

// 函数 FindBaseNum 的定义。它接受一个整数数组 arr、两个整数 Low 和 High,  
// 以及一个函数指针 comp,该函数用于比较两个整数。  
int FindBaseNum(int arr[], int Low, int High,bool(*comp)(const int&,const int&)) {  
  
    // 初始化两个指针,i 指向子数组的起始位置,j 指向子数组的结束位置。  
    int i = Low;  
    int j = High;  
  
    // 选择子数组的第一个元素作为基准(pivot)。  
    int base = arr[Low];  
  
    // 如果子数组的长度大于1(至少有一个元素需要排序),则执行以下操作。  
    if (Low < High) {  
  
        // 当 i 小于 j 时,继续循环。这个循环是快速排序的关键步骤,它不断地将数组划分为两部分,  
        // 一部分是小于基准的元素,另一部分是大于基准的元素。  
        while (i < j) {  
  
            // 当 i 小于 j 且 arr[j] 大于或等于基准时,移动 j 指针到更小的位置。这确保了所有大于基准的元素都在其左侧。  
            while (i < j && !comp(arr[j],base)) {  
                j--;  
            }  
  
            // 如果 i 小于 j,交换 arr[i] 和 arr[j] 的值。这确保了所有小于基准的元素都在其右侧。  
            if (i < j) {  
                arr[i++] = arr[j];  
            }  
  
            // 当 i 小于 j 且 arr[i] 小于基准时,移动 i 指针到更小的位置。这确保了所有大于基准的元素都在其右侧。  
            while (i < j && comp(arr[i],base)) {  
                i++;  
            }  
  
            // 如果 i 小于 j,交换 arr[j] 和 arr[i] 的值。这确保了基准位于其最终的位置上。  
            if (i < j) {  
                arr[j--] = arr[i];  
            }  
        }  
  
        // 将基准放在其最终的位置上。此时,我们只需要对基准左侧和右侧的两个子数组进行相同的操作即可完成排序。  
        arr[i] = base;  
    }  
  
    // 返回基准的位置索引。  
    return i;  
}  
  
// 函数 QuickSort 的定义。它接受一个整数数组 arr、两个整数 low 和 high,以及一个函数指针 comp,该函数用于比较两个整数。  
void QuickSort(int arr[], int low, int higt, bool(*comp)(const int&, const int&)) {  
  
    // 如果 low 小于 higt(子数组的长度大于1),则执行以下操作。  
    if (low < higt) {  
  
        // 找到基准的位置索引。  
        int baseIndex = FindBaseNum(arr, low, higt,comp);  
          
        // 对基准左侧的子数组进行快速排序。  
        QuickSort(arr, low, baseIndex,comp);  
          
        // 对基准右侧的子数组进行快速排序。  
        QuickSort(arr, baseIndex + 1, higt,comp);  
    }  
}  
  
// 函数 QuickSort 的另一个定义,它接受一个整数数组 arr、数组的大小 size,以及一个函数指针 comp,该函数用于比较两个整数。  
void QuickSort(int arr[],int size, bool(*comp)(const int&, const int&)) {  
  
    // 如果 size 大于1且 comp 不为空(存在比较函数),则执行以下操作。这是递归的终止条件,意味着当 size 小于或等于1或 comp 为空时,数组已经被排序,不需要继续排序。  
    if (size>1&&comp) {  
        QuickSort(arr, 0, size-1, comp); // 从子数组的起始位置到结束位置进行排序。  
    }  
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构算法-快速排序 的相关文章

随机推荐

  • TypeError: Cannot read property ‘exclude‘ of undefined

    TypeError Cannot read property exclude of undefined awesome typescript loader和typescript兼容性问题 awesome typescript loader
  • <八>JavaScript中的对象及对像的增删改查

    使用基本数据变量所创建的变量都是独立的 不能成为一个整体 对象属于复合型的数据类型 在对象中可以保存多个不同的数据类型的属性 一 对象的分类 1 1内建对象 由ES标准中定义的对象 比如 Match String Number Boolea
  • Dubbo 支持哪些协议?

    Dubbo 支持多种通信协议 包括但不限于以下几种 Dubbo 协议 Dubbo 框架自带的通信协议 用于服务之间的调用 Hessian协议 轻量级远程调用协议 基于 HTTP 传输 Thrift 协议 跨语言 跨平台的服务接口定义和序列化
  • Linux中使用Curl命令发送HTTP请求的示例——轻松玩转网络

    大家好 今天我要给大家介绍一个在Linux中常用的工具 Curl 它可以帮助我们轻松地发送HTTP请求 让我们一起探索网络世界的奇妙之处吧 首先 让我们了解一下Curl的基本用法 Curl是一个命令行工具 可以用来发送HTTP HTTPS
  • Linux中使用HTTP协议进行Web服务的示例——你的服务器也是“网红”

    大家好 今天我们要聊聊在Linux中如何使用HTTP协议搭建一个Web服务 听起来有点高大上 但其实并不难 让我们一起来看看 首先 我们需要一个Web服务器 在Linux中 最常用的Web服务器之一就是Apache Apache是一个开源的
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)更改应用名称

    鸿蒙 HarmonyOS 项目方舟框架 ArkUI 更改应用名称 一 操作环境 操作系统 Windows 10 专业版 IDE DevEco Studio 3 1 SDK HarmonyOS 3 1 二 更改应用名称 HAP 更改位置如下
  • 什么是微服务

    微服务是一种架构风格 它把一个大型的复杂软件应用划分为一系列小的服务 每个服务都具有单一的功能 运行在其自己的进程中 并通常基于不同的编程语言和框架 这些服务之间通过轻量级通信机制相互通信 这种通信机制基于HTTP协议 微服务架构风格使得系
  • 综合布线实训室建设方案(2024)

    设计单位武汉唯众智创科技有限公司 综合布线实训室概述 随着智慧城市的崛起和新兴行业如人工智能 物联网 云计算 大数据等的迅猛发展 网络布线系统成为现代智慧城市 社区 建筑 家居 工厂和服务业等领域的基础设施和神经网络 实践表明 网络系统故障
  • 【EI会议征稿】第四届环境资源与能源工程国际学术会议(ICEREE 2024)

    第四届环境资源与能源工程国际学术会议 ICEREE 2024 2024 4th International Conference on Environment Resources and Energy Engineering ICEREE
  • 文字怎么转换成语音?这几款软件也许可以帮到你

    如果你还不知道配音工具APP哪个好的话 那我想说的是 今天你可算是来对地方了 随着互联网和智能设备的普及 越来越多的人开始追求创意和个性化的表达方式 而配音工具作为一种实用性极高的工具应运而生 让我们能够轻松地为自己的作品 影视作品 广告等
  • 基于5G数据采集传输的食药冷链云解决方案

    对于食品医药行业 一些产品可能需要保持在稳定温度范围内进行保存与运输 才能保证产品质量与安全 为加强冷链运输中的温湿度管理 物通博联提供基于5G数采通信网关的工业物联网解决方案 帮助企业随时了解冷链过程中各种温湿度的变化 从而及时觉察到异常
  • Vue 条件渲染 v-show

    v show 指令 用于控制元素的显示或隐藏 执行条件 当条件为 false 时 会添加一个 display none 属性将元素隐藏 应用场景 适用于显示隐藏切换频率较高的场景 语法格式 div 内容 div 基础用法
  • 【问题】ipynb文件在ubuntu上的运行?

    目录 安装依赖 转换文件 run ipynb文件 是使用 Jupyter Notebook编写的文件 可以将ipynb文件转换为对应的 python文件 之后在ubuntu上运行即可 安装依赖 pip install jupyter not
  • 高效方便管理多版本Node(windows方式)

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • 【EI会议征稿】第三届新能源技术创新与低碳发展国际研讨会(NET-LC 2024)

    第三届新能源技术创新与低碳发展国际研讨会 NET LC 2024 2024 3rd International Symposium on New Energy Technology Innovation and Low Carbon Dev
  • 插入数计数类 / 转为换行类dp:AT_agc024_e

    https www luogu com cn problem AT agc024 e 首先题目可以转化成每次插入一个数 满足字典序递增 如果只考虑暴力dfs 先别上dp 想想怎么合法和不算重 合法 也就是插入数有3种情况 插到末尾 插到比他
  • 房屋结构健康监测:守护城市生命线的明眼与智慧

    在12月18日 一场突如其来的灾难降临重庆 房屋建筑坍塌 造成3人死亡2人受伤的严重意外 这场悲剧提醒我们 房屋结构的健康不仅关乎我们的生命安全 更是社会稳定的重要基石 如何预防房屋结构问题 确保城市生命线的安全 成为了一个迫切需要解决的问
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)更改应用图标

    鸿蒙 HarmonyOS 项目方舟框架 ArkUI 更改应用图标 一 操作环境 操作系统 Windows 10 专业版 IDE DevEco Studio 3 1 SDK HarmonyOS 3 1 二 更改图标 图标的位置 entry g
  • 解释Nginx用途

    Nginx是一种流行的开源Web服务器软件 主要用于处理HTTP请求和响应 它的主要用途包括 反向代理 Nginx可以作为反向代理服务器 将客户端的请求转发到后端服务器集群上 它具有高可用性 负载均衡和容错能力 能够处理大量的并发请求 静态
  • 数据结构算法-快速排序

    核心思路 快速排序算法核心思路 选择一个 基准 元素 将数组分为两个子数组 一个包含比基准小的元素 另一个包含比基准大的元素 然后对这两个子数组进行递归排序 基准数 初始化两个索引 i 和 j 分别子数组的开头和结尾 初始化基准元素 bas