主要思路:


1、确定 边界 l——————————r  (left right)

2、确定中间值  l————————x——————————r

3、优雅快排:

设置两个指针i,j。

i从左边开始运行 j从右边开始运行 不断判断 判断与x的大小关系 小于x放左边 大于x放右边

讲的有点抽象

所以我引入一个自创比喻
两个黄金矿工(i,j)从两头向中间开始挖矿,两个人都有相同的总目标黄金大小x,但是两个人的具体目标不同,i矿工喜欢小的,j矿工喜欢大的。挖到黄金就放在原地先不动,回头路的时候一起收获。

但是有时候也会遇到陷阱(转移法阵)虽然上面放着黄金,但是一旦触碰到,该黄金矿工就会强制停止,直到另一位矿工开到陷阱。然后两者的陷阱黄金需要置换,一位痛失大的,一位痛失小的。

具体实现代码:

#include <iostream>
using namespace std;

const int N = 1000010;//创造一个足够大的数组

int n;

int q[N];

void quicksort(int q[], int l, int r)
{
if (l >= r)return;//左大于右 显然需要去除该情况

int x = q[l + r >> 1],i =l-1,j =r+1;// 未来(?)和以前的我: 这个>> 是什么意思??
//在这里解释:向右移动一位 (二进制) 亲爱的 那笔写一下 10 的二进制 然后 右缩进一位 试试看
while (i < j)
{
do i++; while (q[i] < x);//指针开始向右移动
do j--; while (q[j] > x);//指针开始向左移动 有一种反方向的钟的感觉
if (i < j) swap(q[i], q[j]);//指针遇到不符合的情况卡住了 两者换位置
}
quicksort(q, l, j);
quicksort(q, j + 1, r);

}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)scanf("%d", &q[i]);
quicksort(q, 0, n - 1);
for (int i = 0; i < n; i++)printf("%d ", q[i]);
return 0;

}

最新文章

  1. MSSQL远程连接
  2. 圆形背景的TextView
  3. MongoDB配置服务--MongoDB安装成为windows服务
  4. C++模板类继承的一个小技巧
  5. 加速Web开发的9款知名HTML5框架
  6. Android 6.0权限
  7. centos6.5中 nginx-1.6.3 编译安装
  8. [芯片][MPU6050] MPU60X0的DMP相关链接
  9. oc-30-堆栈
  10. hdu 4669 动态规划
  11. ORACLE PL/SQL异常处理(Exception)学习笔记
  12. 黑马程序员_Java集合Map
  13. beanutils通过SimpleProperty使用get或set方法赋值
  14. 《Windows驱动开发技术详解》之Windows内核函数
  15. Dart 的function
  16. 微信自带浏览器不支持form表单post提交方案解决
  17. JSP数据库插入判断
  18. SpringMVC的底层实现
  19. @CookieValue使用须知
  20. 使用httpClient模拟http请求

热门文章

  1. TTD 专题 (第一篇):C# 那些短命线程都在干什么?
  2. Js实现一键复制小功能
  3. LinkedBlockingQueue详解
  4. Mybatis-Plus自动生成器生成代码基于springboot项目启动
  5. 2022年整理最详细的java面试题、掌握这一套八股文、面试基础不成问题[吐血整理、纯手撸]
  6. C语言------程设设计入门
  7. 齐博x1嵌套-循环栏目,并列出子栏目下的内容
  8. 这次彻底读透 Redis
  9. vue使用elementUI组件提交表单(带图片)到node后台
  10. 用Nodejs 实现一个简单的 Redis客户端