c++ 快速排序算法【过程图解】

发布时间 - 2026-01-11 01:07:38    点击率:

第一、算法描述

快速排序由C. A. R. Hoare在1962年提出,该算法是目前实践中使用最频繁,实用高效的最好排序算法,

快速排序算法是采用分治思想的算法,算法分三个步骤

1.从数组中抽出一个元素作为基数v(我们称之为划界元素),一般是取第一个、最后一个元素或中间的元素

2.将剩余的元素中小于v的移动到v的左边,将大于v元素移动到v的右边

3.对左右两个分区重复以上步骤直到所有元素都是有排序好。

第二、算法实现

/*序列划分函数*/
int partition(int a[], int p, int r) {
  int key = a[r];//取最后一个
  int i = p - 1;
  for (int j = p; j < r; j++)
  { 
    if (a[j] <= key)
    {     
      i++;
      //i一直代表小于key元素的最后一个索引,当发现有比key小的a[j]时候,i+1 后交换     
      exchange(&a[i], &a[j]);
    }   
  } 
  exchange(&a[i + 1], &a[r]);//将key切换到中间来,左边是小于key的,右边是大于key的值。
  return i + 1;
}
 
void quickSort(int a[], int p, int r) {
  int position = 0;
  if (p<r)
  {
    position = partition(a,p,r);//返回划分元素的最终位置
    quickSort(a,p,position-1);//划分左边递归
    quickSort(a, position + 1,r);//划分右边递归
  } 
}
 
void main() {
  int d[] = { 6,4,1,8,7,5 };
  cout << "输入数组 { 6,4,1,8,7,5 } " << endl; 
  quickSort(d, 0, 5);
  print_arr(d, 6);
 
}

两个辅助函数:

void exchange(int * a, int* b) {
  int temp = *a;
  *a = *b;
  *b = temp;
}
void print_arr(int *a, int size) //打印函数 
{
  cout << "打印数组:";
  for (int i = 0; i<size; i++)  //打印数组 
  {
    cout << a[i] << " ";
  }
  cout << endl << endl;
}

测试输出:

第三、算法图解分析

下面我们来具体分析下程序怎么运行的,

quickSort(d, 0, 5);代表以靠最有一个元素5作为基数,

程序初始化时候p=0,r=5,i=-1,j=0,key=5

通过上图我们观察到:

1.i逐渐增加,它一直代表着小于key=5的最后一个元素,j也在主键增加,一直到key前面一个元素停止

2.此时循环到了最后一个元素7,以5为基数的循环已经结束,此时i=1,a[i+1]=6,交换6和5交换,完成本轮循环

返回i+1=2,依索引2为分界线拆分2个数组,进入递归循环,执行类似上图操作

第四、总结

快速排序之所以快,相比冒泡排序他的交换是跳跃式的,它的最差时间复杂度是O(N2) 和冒泡一样,但是它的平均时间复杂度是O(nlog2N),是一种就地排序算法,

看了很多别人写的算法介绍,还是觉的不够清晰,于是决定自己写一篇博文,希望能帮助需要的人快速理解,文章中的用图是自己画的。

以上这篇c++ 快速排序算法【过程图解】就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# c  # 快速排序算法  # C++冒泡排序算法实例  # c++中八大排序算法  # C++选择排序算法实例  # C++堆排序算法的实现方法  # C++归并排序算法实例  # C++选择排序算法实例详解  # 利用C++的基本算法实现十个数排序  # C++插入排序算法实例  # C++实现各种排序算法类汇总  # 一文带你彻底看懂C++常见排序算法  # 递归  # 希望能  # 给大家  # 上图  # 的人  # 是一种  # 看了  # 第一个  # 是有  # 也在  # 最有  # 这篇  # 小编  # 本轮  # 已经结束  # 大家多多  # 切换到  # 写一篇  # 称之为  # 组中 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在万网自助建站平台快速创建网站?  LinuxShell函数封装方法_脚本复用设计思路【教程】  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  如何在Ubuntu系统下快速搭建WordPress个人网站?  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Laravel怎么实现验证码(Captcha)功能  Java遍历集合的三种方式  Laravel如何实现多对多模型关联?(Eloquent教程)  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何快速搭建支持数据库操作的智能建站平台?  香港服务器租用每月最低只需15元?  Python3.6正式版新特性预览  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  Android利用动画实现背景逐渐变暗  bing浏览器学术搜索入口_bing学术文献检索地址  QQ浏览器网页版登录入口 个人中心在线进入  Laravel怎么调用外部API_Laravel Http Client客户端使用  高防服务器租用如何选择配置与防御等级?  如何在云服务器上快速搭建个人网站?  Laravel如何使用Eloquent进行子查询  Android自定义控件实现温度旋转按钮效果  三星网站视频制作教程下载,三星w23网页如何全屏?  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  如何在万网自助建站中设置域名及备案?  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  如何在橙子建站中快速调整背景颜色?  如何用IIS7快速搭建并优化网站站点?  微信小程序 wx.uploadFile无法上传解决办法  zabbix利用python脚本发送报警邮件的方法  Python面向对象测试方法_mock解析【教程】  如何生成腾讯云建站专用兑换码?  Laravel定时任务怎么设置_Laravel Crontab调度器配置  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  高防服务器如何保障网站安全无虞?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  智能起名网站制作软件有哪些,制作logo的软件?  Laravel如何为API生成Swagger或OpenAPI文档  香港服务器租用费用高吗?如何避免常见误区?  敲碗10年!Mac系列传将迎来「触控与联网」双革新  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性