快速排序算法-C语言

ops/2024/11/26 6:40:29/

第一步:实现分区函数

根据题目中的“快速排序”,我们需要实现一个分区函数,这个功能的实现:

  1. 设定基准值 pivot
  2. 使用两个指针 lowhigh,分别从数组的两端向中间移动,进行元素交换。
int part(int A[], int low, int high){int pivot = A[low]; // 设定基准值while (low < high) { // 循环直到两个指针相遇while (low < high && A[high] >= pivot) // 从右边开始向左找第一个小于pivot的数--high;A[low] = A[high]; // 将找到的数放到左边while (low < high && A[low] <= pivot) // 从左边开始向右找第一个大于pivot的数++low;A[high] = A[low]; // 将找到的数放到右边}A[low] = pivot; // 将基准值放到中间return low; // 返回基准值的位置
}

第二步:实现快速排序函数

根据题目中的“快速排序”,我们需要递归地对分区后的子数组进行排序。

void Quicksort(int A[], int low, int high){if (low < high) { // 如果子数组长度大于1,则继续排序int pivotpos = part(A, low, high); // 调用分区函数Quicksort(A, low, pivotpos - 1); // 对左子数组排序Quicksort(A, pivotpos + 1, high); // 对右子数组排序}
}

代码注释

// 分区函数,用于快速排序
int part(int A[], int low, int high) {int pivot = A[low]; // 选择最左边的元素作为基准值while (low < high) { // 当两个指针没有相遇时继续while (low < high && A[high] >= pivot) // 从右向左找第一个小于基准值的元素--high;A[low] = A[high]; // 将找到的元素放到左边while (low < high && A[low] <= pivot) // 从左向右找第一个大于基准值的元素++low;A[high] = A[low]; // 将找到的元素放到右边}A[low] = pivot; // 将基准值放到中间return low; // 返回基准值的位置
}// 快速排序函数
void Quicksort(int A[], int low, int high) {if (low < high) { // 如果数组长度大于1,则继续排序int pivotpos = part(A, low, high); // 获取基准值的位置Quicksort(A, low, pivotpos - 1); // 对左边的子数组进行快速排序Quicksort(A, pivotpos + 1, high); // 对右边的子数组进行快速排序}
}

变量变化表格

步骤lowhighpivotA[low]A[high]说明
开始05337初始化
第1次循环14332移动high
第2次循环14332交换A[low]和A[high]
第3次循环23312移动low
第4次循环23315移动high
结束22335基准值归位

http://www.ppmy.cn/ops/136769.html

相关文章

vue3 + ts:开发插件 / Plugins / 注册全局实例 / 在 template 与 setup 中使用 / provide、inject

一、理解插件 / Plugins https://cn.vuejs.org/guide/reusability/plugins.html 理解一 一个插件通常是一个对象&#xff0c;包含一个 install 方法。install 方法在插件注册时被调用&#xff0c;用于将插件的功能和特性添加到 Vue 应用实例中。 理解二 插件 (Plugins) 是…

/proc/sys/net/ipv4/ip_forward 被关闭问题排查

问题描述 之前搭了一个mongodb, 在docker中部署mongodb&#xff0c;做了端口转发&#xff0c;但是发现mongodb总是失联&#xff0c;每隔一段时间就会断开&#xff0c;但是容器还存在&#xff0c;最后定位到是端口转发被关闭了:/proc/sys/net/ipv4/ip_forward docker的端口转发…

二叉树的深度搜索专题一>计算布尔二叉树的值

题目&#xff1a; 题目解析&#xff1a; 算法解析&#xff1a; 代码&#xff1a; public boolean evaluateTree(TreeNode root) {if(root.left null && root.right null) return root.val 1 ? true : false;boolean leftTree evaluateTree(root.left);boolean…

python excel接口自动化测试框架!

今天采用Excel继续写一个接口自动化测试框架。 设计流程图 这张图是我的excel接口测试框架的一些设计思路。 首先读取excel文件&#xff0c;得到测试信息&#xff0c;然后通过封装的requests方法&#xff0c;用unittest进行测试。 其中&#xff0c;接口关联的参数通过正则进…

内存不足引发C++程序闪退崩溃问题的分析与总结

目录 1、内存不足一般出现在32位程序中 2、内存不足时会导致malloc或new申请内存失败 2.1、malloc申请内存失败&#xff0c;返回NULL 2.2、new申请内存失败&#xff0c;抛出异常 3、内存不足项目实战案例中相关细节与要点说明 3.1、内存不足导致malloc申请内存失败&#…

Android12 的 Vold梳理

1.代码位置 system/vold/ 路径下,查看bp文件&#xff0c;发现是编译system/vold/main.cpp编译生成可执行文件vold 2.app侧调用代码流程 2.1 整体框架 #mermaid-svg-lqO8phN62rKNW407 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#…

灰色预测GM(1,1)-Matlab实现

灰色预测是通过少量的&#xff0c;不完全的信息&#xff0c;建立数学模型并给出预测的一种预测方法 是处理小样本预测问题的有效工具 适用条件 (1)数据是以年份度量的非负数据&#xff08;如果是月份或者季度数据一般要用时间序列模型&#xff09; (2)数据能通过准指数规律的…

【C语言】传值调用与传址调用:深度解析与实现

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;什么是传值调用和传址调用&#xff1f;1. 传值调用&#xff08;Call by Value&#xff09;2. 传址调用&#xff08;Call by Reference&#xff09; &#x1f4af;传值调…