当前位置: 首页 > ops >正文

快速排序C++实现

下面是一个更简洁、更容易理解的快速排序C++实现。这个版本使用了更直观的方式选择基准值,并通过单独的辅助函数简化了分区过程:

#include <iostream>
#include <vector>
using namespace std;// 交换两个元素
void swap(int& a, int& b) {int temp = a;a = b;b = temp;
}// 分区函数:将数组分为两部分,左边小于基准值,右边大于基准值
int partition(vector<int>& arr, int left, int right) {// 选择中间元素作为基准值(更直观的选择)int pivot = arr[(left + right) / 2];int i = left;    // 左指针int j = right;   // 右指针while (true) {// 找到左边第一个大于等于基准值的元素while (arr[i] < pivot) i++;// 找到右边第一个小于等于基准值的元素while (arr[j] > pivot) j--;// 如果指针交叉,分区完成if (i >= j) return j;// 交换左右指针指向的元素swap(arr[i], arr[j]);i++;j--;}
}// 快速排序主函数
void quickSort(vector<int>& arr, int left, int right) {if (left < right) {// 分区并获取基准值位置int pivotIndex = partition(arr, left, right);// 递归排序左右两部分quickSort(arr, left, pivotIndex);quickSort(arr, pivotIndex + 1, right);}
}// 打印数组
void printArray(const vector<int>& arr) {for (int num : arr) {cout << num << " ";}cout << endl;
}int main() {vector<int> arr = {3, 6, 8, 10, 1, 2, 1};cout << "排序前的数组: ";printArray(arr);quickSort(arr, 0, arr.size() - 1);cout << "排序后的数组: ";printArray(arr);return 0;
}

这个实现的特点:

  1. 基准值选择:使用中间元素作为基准值,更容易理解和实现
  2. 双指针法:通过左右两个指针相向移动,将数组分为两部分
  3. 简洁的分区逻辑:使用while(true)循环和指针交叉判断,使分区过程更清晰
  4. 递归调用:清晰地将数组分为左右两部分进行递归排序

代码解释:

  • partition函数:选择中间元素作为基准值,左右指针分别向中间移动,将比基准值小的元素交换到左边,比基准值大的元素交换到右边,直到指针交叉。
  • quickSort函数:递归地对基准值左右两部分进行排序。
  • main函数:创建测试数组,调用排序函数并输出结果。

这个版本的快速排序代码更适合初学者理解算法的核心思想,同时保持了良好的性能特性。

http://www.xdnf.cn/news/14200.html

相关文章:

  • IO扩展的一种简易方法
  • ECharts 图表生成示例
  • CentOS7报错:Cannot find a valid baseurl for repo: base/7/x86_64
  • day034-rsync异地容灾
  • org.springframework.cloud.openfeign 组件解释
  • JAVA实战开源项目:在线课程管理系统 (Vue+SpringBoot) 附源码
  • 超强人工智能解决方案套件InfiniSynapse:精准的业务理解、对各种数据源进行全模态联合智能分析--部署安装@Ubuntu22.04 @Docker
  • 【Z Arcade】八色部落战争各阵营兵种分析级排名
  • 【C语言练习】096. 使用C语言实现简单的游戏逻辑
  • RK AndroidFramework 内置应用可,卸载,恢复出厂设置恢复安装
  • 蓝桥杯国赛前一晚知识点准备(十六届python)
  • 多线程——锁
  • Keepalived 高可用
  • 基于SpringBoot+JSP开发的招投标采购信息平台
  • 插入点(position) 和对齐点(AlignmentPoint)详解——CAD c#二次开发
  • 59、定制化原理-SpringBoot定制化组件的几种方式
  • STM32 vs RT1176:正交编码器实现原理与工程实践全解析
  • AI-调查研究-06-“冷水澡”对生理健康的影响与机制【下篇】
  • LangChain自动化工作流实战教程:从任务编排到智能决策
  • FOC无刷电机控制:ABZ与SPI信号选择
  • 【0.1 漫画计算机组成原理】
  • Vue3 + TypeScript + Element Plus 使用【设置表格列宽,组合式函数 hook】在原有页面实现表格列宽设置本地持久化实例总结
  • MySQL(75)如何进行增量备份和恢复?
  • 2.4 机器人运动控制
  • sd调试记录(标准库 + keil + RL-FlashFS):
  • 算法题:一个数组,找出其中最小连续的子数组,是的这个子数组排序后,整体数组...
  • [直播推流] 编译 librtmp 库
  • 【QT】控件一(QWidget、Button、Label)
  • 设计模式汇总
  • 从易用性出发的教育场景音量调节技术方案