快速排序算法讲解及代码(详细)

2023-11-02

一、序言

快速排序是一种高效且使用广泛的排序算法,在很多语言的标准库中自带的排序都是快速排序。所以我们也有必要了解快排的原理以及实现方法。

二、快速排序基本思想

算法思想:快速排序实现的重点在于数组的拆分。通常我们将数组的第一个元素作为比较元素,然后将数组中小于比较元素的数放到左边,将大于比较元素的放在右边。
这样我们就将数组拆分成了两部分:小于比较元素的数组和大于比较元素的数组。我们再对这两个数组进行相同的拆分。直到拆分到不能再拆分,数组自然就以升序排列了。

三、具体步骤

①、定义两个变量 i 和 j分别指向待排序数组的首尾,定义一个临时变量temp存储比较元素的值(一般取第一个元素,一次排序目的就是令temp在序列中寻找一个合适的位置,使temp左侧元素都不超过temp,右侧的元素都大于temp)
②、令 j 不断向左移动,直到找到某一元素A[ j ] <= 该元素,然后将它挪到A[ i ]所在位置(A[ i ]处的元素已经保存在了temp中),j 进入等待状态, 进入③
③、令 i 不断向右移动, 直到某一元素值A[ i ] > 该元素, 将A[ i ]挪到A[ j ]所在位置(原来的元素已经挪到了该去的地方), i 进入等待状态, 进入②
④、②③不断循环,当i 和 j 指向同一个位置时该位置就是temp应该插入的位置,直接插入就行了(原来的元素已经挪到了该去的地方)

现在temp左侧的元素一定不大于它,temp右侧的元素一定大于它,等于说当整个数组全部排好序后temp的位置就在这里

下面进行左边[ 0, temp-1 ] 和 右边[temp+1, n-1]位置元素的排序(传参就是方括号里面的),方法和上面的相同,然后再不断的切割不断地排序,直到某一区间仅有一个元素为止,这就要用到递归了。

四、具体代码

#include<stdio.h>
#include<stdlib.h>

#define MAX 10

void display(int arr[],int num){//遍历数组
    int i;
    for(i = 0;i < num;i++){
        printf("%-5d",arr[i]);
    }
    printf("\n");
    return;
}

void quitarray(int arr[],int low,int high){//快速排序
    if(low < high){
        int i = low;
        int j = high;
        int temp = arr[i];//存放比较值
    

        while(i < j){
            while(i < j && arr[j] >= temp){
                j--;
            }
            if(i < j){
                arr[i] = arr[j];
                i++;
            }

            while(i < j && arr[i] <= temp){
                i++;
            }
            if(i < j){
                arr[j] = arr[i];
                j--;
            }
            arr[i] = temp;
        }

        quitarray(arr,low,j-1);//左边
        quitarray(arr,i+1,high);//右边
    }
}

int main(){

    int arr[MAX] = {13,76,43,9,5,98,100,99,32,14};

    int num = MAX;
    display(arr,num);//没有排序之前数组

    quitarray(arr,0,num - 1);//快速排序
    display(arr,num);//排序完之后的数组
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速排序算法讲解及代码(详细) 的相关文章

  • 头歌(C语言)-数据结构与算法-排序-第2关:实现快速排序

    任务描述 相关知识 编程要求 评测说明 任务描述 本关要求通过补全快速排序私有函数QSort 来供函数QuickSort调用 以此来实现快速排序的功能 相关知识 快速排序的基本过程是 从待排序记录中任选一个记录 以它的排序码作为中心值 将其
  • 每日编程一题刷之有序数组的平方(暴力解法+双指针)

    每日编程一题刷之有序数组的平方 暴力解法 双指针 目录侠 文章目录 每日编程一题刷之有序数组的平方 暴力解法 双指针 题目链接以及描述 题解分析 双指针解法 小结 题目链接以及描述 977 有序数组的平方 力扣 LeetCode leetc
  • Python的heapq堆模块

    heapq模块 一 heapq内置模块 二 heapq 模块的使用 1 创建堆方法 2 访问堆的方法 2 获取堆的最大值 最小值方法 总结 一 heapq内置模块 Python中的heapq模块提供了一种堆队列heapq类型 这样实现堆排序
  • 归并排序(分析与模板)

    归并排序 思路 1 确定分界元素mid left right 2 2 递归分解数组 两两组合组成两个有序数组 3 归并 合二为一 int temp 100010 merge sort int num int l int r if l gt
  • C/C++排序

    目录 C排序 头文件 使用 C 排序 头文件 使用 1 自定义类型 2 自定义类型 C排序 C语言中排序函数为qsort 原理为快速排序 头文件 在使用前 要添加头文件如下 include
  • 2. 合并两个有序数组

    2 合并两个有序数组 题目描述 解题思路 代码 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并 nums2 到 nums
  • C语言:二分查找(折半查找),冒泡排序

    目录 一 二分查找 二分查找的需注意的细节 二 冒泡排序 冒泡排序需注意的细节 本篇博客详细讲解常用的几个方法 分别是二分查找和冒泡排序法 一 二分查找 二分查找 意思就是每次都分为两部分 将查找的数字和中间数字相比 判断大小后确定所查找数
  • 快速排序(C语言简单实现)

    快速排序 C语言简单实现 快速排序 Quick Sort 是冒泡排序的升级版 基本思想 通过一趟排序将待排记录分割成独立的两部分 其中一部分记录的关键字均比另一部分记录的关键字小 则可分别对这两部分记录继续进行排序 以达到整个序列有序的目的
  • 【数据结构】——八大排序

    文章目录 1 插入排序 2 冒泡排序 3 希尔排序 4 选择排序 5 快速排序 快排优化 递归改非递归 6 堆排序 7 归并排序 递归归并排序 改成非递归 8 计数排序 9 题目 总结 排序的时间检验 对于不同排序的时间复杂度分析 1 插入
  • 算法学习01-选择、冒泡、插入排序

    1 选择排序 选择排序 0到n 1位置 找到最小值 放到0位置 1到n 1位置 找到最小值 放到1位置 i到n 1位置 找到最小值 放到i位置 以此类推 public class SelectionSort public static vo
  • C++ 快速排序

    快速排序是比较常用的一种排序 平均时间复杂度为O nlogn 最坏的时间复杂度为O n 话不多说 上代码 include
  • 大数据量的冒泡排序 (计次数)

    题目描述 给定一个包含从0到n 1各一次的数组 若使用冒泡排序将其排为升序 问其中需要进行多少次交换 输入 测试数据有多组 每组由两行组成 第一行包含正整数n n lt 5000 下一行包含从0到n 1的n个整数的序列 输出 对于每组测试数
  • 用 Java 实现的八种常用排序算法

    八种排序算法可以按照如图分类 前置知识 1 算法稳定性 在一个序列中 能保证两个相等的数 经过排序之后 其在序列的前后位置顺序不变 A1 A2 排序前 A1 在 A2 前面 排序后 A1 还在 A2 前面 2 时间复杂度 时间复杂度是用于衡
  • 插入排序总结

    插入排序 Insertion Sort 的算法描述是一种简单直观的排序算法 它的工作原理是通过构建有序序列 对于未排序数据 在已排序序列中从后向前扫描 找到相应位置并插入 排序思路 假设按照升序排序 1 从索引为1的元素开始向前比较 一旦前
  • Insertion插入排序

    原谅我接着偷懒 是真的没有什么写的内容了啊 好怀疑他们那些大佬是怎么那么多的文章和技术分享的 自闭中ing 最好情况的时间复杂度是 O n 最坏情况的时间复杂度是 O n2 然而时间复杂度这个指标看的是最坏的情况 而不是最好的情况 所以插入
  • 全面分析冒泡排序过程

    冒泡排序也是一种简单直观的排序算法 其思想是 它重复地走访过要排序的数列 一次比较两个元素 如果他们的顺序错误就把他们交换过来 走访数列的工作是重复地进行直到没有再需要交换 也就是说该数列已经排序完成 这个算法的名字由来是因为越小的元素会经
  • C语言排序算法实现

    C语言实现各种排序算法 冒泡排序 选择排序 插入排序 希尔排序 插入方式 非交换方式 快速排序 归并排序 分治思想 基数排序 桶排序 基数排序的基本思想 典型的空间换时间方式 冒泡排序 include
  • Java 常用的大算法详解

    Java 常用的大算法详解 排序算法是计算机科学中的重要主题之一 Java 提供了许多常用的排序算法 本文将详细介绍其中的几种 并提供相应的源代码实现 冒泡排序 Bubble Sort 冒泡排序是一种简单直观的排序算法 它重复地遍历待排序的
  • 算法导论 学习笔记 第七章 快速排序

    快排最坏时间复杂度为 n 但它的平均性能很好 通常是实际排序应用中最好的选择 它的期望时间复杂度为 nlgn 且 nlgn 中隐含的常数因子非常小 且它还能进行原址排序 快排也使用了分治思想 1 分解 数组被划分为两个子数组 使得一个子数组
  • 八大排序(希尔排序)

    上篇文章我们来看了看插入排序是怎么实现的 本章内容就是在插入排序的基础上完成希尔排序 希尔排序是一个比较强大的排序 我们希尔排序的时间复杂度是比较难算的 这里直接给出的结论就是时间复杂度就是O N 1 3 比较难算的原因就是我们每一次的次数

随机推荐

  • c#基础语法笔记----个人学习笔记

    改变应用图标 1 当 解决方案资源管理器 中有项目选中时 在 项目 菜单上单击 属性 2 选择 应用程序 窗格 3 从 图标 下拉列表中选择图标 ico 文件 实例化 new 类名 例如 user a new user 可写 set ret
  • Matplotlib学习

    Matplotlib学习 1 什么是Matplotlib 是专门用于开发2D图表 包括3D图表 以渐进 交互式方式实现数据可视化 2 为什么要用Matplotlib 可视化是在整个数据挖掘的关键辅助工具 可以清晰的理解数据 从而调整我们的分
  • python类的公有和私有

    结论 python里并没有严格的私有变量和函数限制 仅仅是对程序员的限制 尽量不要去使用 1 xxx 单下划线 开始的成员变量叫做保护变量 意思是只有类实例和子类实例能访问到这些变量 需通过类提供的接口进行访问 2 xxx 类中的私有变量
  • 解决在Android中给Button设置Padding无效的问题

    在Xml中给Button设置padding 0 和用代码给Button设置padding 0 都无效 是因为 这种情况下 Button的宽高是受TextView中的变量 mMinWidth mMinHeight和View中的变量 mMinW
  • Qt自定义控件封装

    自定义控件封装 样例效果 描述 部件QSpinBox和QSlider组合 改变其中一个的值 另一个随之改变 添加按钮快速获取或设置组合的值 部件组合 新建项目 添加新建项Qt gt Qt设计师界面类 gt 选择界面模板 widget gt
  • 启动Jmeter报警告,用管理员身份运行jmeter.bat,以后不再报警告。

    今天在新电脑启动Jmeter 发现命令行窗口报出警告 Could not open create prefs root node Software JavaSoft Prefs at root 0x80000002 Windows RegC
  • 华为OD机试真题 Java 实现【按身高和体重排队】【2022Q4 100分】,附详细解题思路

    一 题目描述 某学校举行运动会 学生们按编号 1 2 3 n 进行标识 现需要按照身高由低到高排列 对身高相同的人 按体重由轻到重排列 对于身高体重都相同的人 维持原有的编号顺序关系 请输出排列后的学生编号 二 输入描述 两个序列 每个序列
  • Ubuntu 20.04 安装 WPS 2019 及其卸载

    Ubuntu 20 04 安装 WPS 2019 1 打开WPS官网 https linux wps cn 下载安装包 2 下载deb格式 下载好的文件如下图 3 打开终端 依次输入命令 我下载的文件在 下载 文件夹当中 默认的也是这个文件
  • 解决Backtrader中self.broker.get_value()值为nan与问题解析

    解决方法 删除数据源中close为空的行 或者更极端一点 删除存在空值的行 主要查看数据源是否存在缺失值 如果使用Backtrader的默认逻辑 计算value会对应收盘价 收盘价不能有缺失值 如果使用开盘价购买 则开盘价不能有缺失值 问题
  • 【JavaScript数据结构与算法】数组类(电话号码的字符组合)

    个人简介 个人主页 前端杂货铺 学习方向 主攻前端方向 也会涉及到服务端 Node js 个人状态 在校大学生一枚 已拿多个前端 offer 秋招 未来打算 为中国的工业软件事业效力 n 年 推荐学习 前端面试宝典 Vue2 Vue3 Vu
  • PTA 08-图9 关键活动 题目关键点说明及解法完全分析

    PTA mooc完整题目解析及AC代码库 PTA 拼题A 浙江大学中国大学mooc数据结构全AC代码与题目解析 C语言 假定一个工程项目由一组子任务构成 子任务之间有的可以并行执行 有的必须在完成了其它一些子任务后才能执行 任务调度 包括一
  • MyBatis—利用MyBatis查询(查询所有,查询一行,条件查询)

    文章目录 1 查询所有 2 查询详情 通过特定属性查询 3 多条件查询 1 接口参数列表三种表达方式 2 多条件查询 3 动态Sql 4 多条件动态查询 5 单条件动态查询 1 查询所有 基本步骤 1 定义mapper接口 编写接口方法 2
  • keil5烧录或下载程序出现停止工作的问题

    本人在使用keil5烧录或下载程序出现停止工作的问题 开始认为是keil版本的原因 后来使用了keil4发现问题依然存在 发现因为本人使用了盗版JLINK被驱动检测出来了 由于安装的驱动版本为V6 14 新版的驱动检测到盗版JLINK 一旦
  • 1014 Waiting in Line (30)

    题目描述 Suppose a bank has N windows open for service There is a yellow line in front of the windows which devides the wait
  • 成为FISCO BCOS MVP,并肩链上创未来

    开源以来 FISCO BCOS受到众多开发者的支持 支撑生态内企业数百个应用项目的研发 其中 超120个应用投入使用 目前开源社区已汇聚了超40000名开发者 既有在区块链路上探索实践的开发者 也有自成一派 颇有建树的技术大牛 大家聚集于此
  • ESP32-C3 学习测试 蓝牙 篇(七、GATT 数据通信 — 发送自定义数据)

    前面我们已经入门了 GATT 的开发 更进一步 进行想要的数据通信 目录 前言 1 通信问题思考 2 如何才能每次传输不同的数据 3 对 handle 的认识 4 继续尝试 5 测试成功 结语 前言 本来计划直接做一个蓝牙的小应用 首先得实
  • 【Unity故障】Unityhub登录界面白屏(刷新不出那种感觉)

    平时打开UnityHub可能也就是偶尔需重新激活一下许可证 今天进去发现每个工程后都一个黄色感叹号标志 看了下账号也没登状态 当我以为登个账号就解决 然后就一直卡在这个界面 好像在哪看见过这个问题直接百度搜 资料很多 前人已经帮我们铺平了道
  • java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.

    springboot 配置多数据源时 启动出现java lang IllegalArgumentException jdbcUrl is required with driverClassName 修改 spring datasource
  • HIVE解析JSON数组

    HIVE解析JSON数组 数据示例 payAmount 375000 payChannelCode BOC payAmount 376000 payChannelCode AOC 1 get json object函数提取json数组里面特
  • 快速排序算法讲解及代码(详细)

    快速排序算法 一 序言 二 快速排序基本思想 三 具体步骤 四 具体代码 一 序言 快速排序是一种高效且使用广泛的排序算法 在很多语言的标准库中自带的排序都是快速排序 所以我们也有必要了解快排的原理以及实现方法 二 快速排序基本思想 算法思