解题思想
快速排序使用了“分治”的思想
① 确定分界点
② 调整区间
③ 递归地处理左右两段
“调整区间”是最难的步骤,主要有两种方法:
① 暴力做法,需要额外地开辟空间
② 引入两个指针变量i和j
快速排序算法模板
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + 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]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
C++ 代码
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int q[N];
void quick_sort(int q[], int l, int r)
{
//快速排序核心算法
if (l >= r) return; // 首先判断边界点,如果只有一个点,则直接输出
int x = q[l], i = l - 1, j = r + 1; // 首先将i和j两个指针分别向左、右多移出一个位置
while(i < j)
{
do i ++ ; while (q[i] < x);
do j -- ; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
//递归地处理左右两段
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i ++) scanf("%d", &q[i]); // 排序前扫描所有的数
quick_sort(q, 0, n - 1); // 快速排序核心算法调用
for (int i = 0; i< n; i ++) printf("%d ", q[i]); // 排序后输出所有的数
return 0;
}