主要思路:
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;
}
标签:int,quicksort,while,++,算法,课后,矿工,排序,指针 From: https://www.cnblogs.com/ChenDOU/p/17007057.html