快速排序
Posted meakle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序相关的知识,希望对你有一定的参考价值。
快速排序
快速排序的基本思想
- 利用分治的思想
快速排序的基本思路
将数组分成两个部分,一个部分大于某个数,一个部分小于某个数,然后递归,直到所有的数字都排序完成
- 边界判断
l >= r
时return
- 设定一个
x
值,这个x
值可以是左边界l
,右边界r
,或者是(l + r)/2
,甚至是随机的值(不能超过边界) - 移动数据,将
<= x
的值放在x
的左边,将>= x
的值放在x
的右边 - 递归
如何移动数据
开辟新的数组
方法一开辟两个新的数组,一个数组用来存放<= x
的值,一个数组用来存放>= x
的值
利用两个指针
在数组的头部和尾部各使用一个指针
- 先看左指针:左指针指向的值是否
<= x
如果是,那么指针指向下一个数据(指针方向往右走),如果不是停止移动 - 再看右指针:右指针指向的值是否
>= x
如果是,那么指针指向上一个数据(指针方向往左走),如果不是停止移动 - 判断
左指针 < 右指针
正确的话就直接交换 - 重复这三步,当出现
左指针 >= 右指针
的时候退出循环
快排模板
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int q[N];
void q_sort(int q[], int l, int r){
if(l >= r) return;
int x = q[(l + r) >> 1];
int i = l - 1;
int j = r + 1;
while(i < j){
do {
i++ ;
} while (q[i] < x);
do {
j-- ;
} while (q[j] > x);
if(i < j) swap(q[i], q[j]);
}
q_sort(q, l, j);
q_sort(q, j + 1, r);
}
int main(){
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &q[i]);
}
q_sort(q, 0, n - 1);
for(int i = 0; i < n; i++){
printf("%d ", q[i]);
}
return 0;
}
以上是关于快速排序的主要内容,如果未能解决你的问题,请参考以下文章