1、先从数列中取出一个数作为基准数
2、扫描数列,将比基准数小的元素全部放在左边,大的放在右边
3、再对左右两个区间重复第二步,直到各个区间少于两个数
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <algorithm>
#include <vector>
using namespace std;
int part(vector<int>&a, int left, int right) //划分函数
{
int i = left, j = right, pivot = a[left]; //基准元素
while (i < j)
{
while (i<j && a[j]>pivot) //从右向左开始找一个 小于等于 pivot的数值
{
j--;
}
if (i < j)
{
swap(a[i++], a[j]); //a[i]和a[j]交换后 i 向右移动一位
}
while (i < j && a[i] <= pivot) //从左向右开始找一个 大于 pivot的数值
{
i++;
}
if (i < j)
{
swap(a[i], a[j--]); //a[i]和a[j]交换后 i 向左移动一位
}
}
return i; //返回最终划分完成后基准元素所在的位置
}
void Quicksort(vector<int>& a, int left, int right)
{
int mid;
if (left < right)
{
mid = part(a, left, right); // 对该区间进行分配 左边小 右边大 并返回基准元素位置
Quicksort(a, left, mid - 1); // 左区间递归快速排序
Quicksort(a, mid+1, right); // 右区间递归快速排序
}
}
int main()
{
int N;
cin >> N;
vector<int> a(N);
for (int i = 0; i < N; i++)
{
cin >> a[i];
}
Quicksort(a, 0, N - 1);
for (int i = 0; i < N; i++)
{
cout << a[i] << " ";
}
return 0;
}