一.算法介绍
快速排序(Quicksort)是对冒泡排序算法的一种改进。
快速排序的核心思想是分治。
快速排序几乎是目前所有排序法中速度最快的方法(顾名思义)(¬_¬)。
STL的sort()函数就是基于快速排序的优化。
时间复杂度 | O |
---|---|
最好 | O( n log 2 n n\log_2n nlog2n) |
最坏(遇见概率极小) | O( n 2 n^2 n2) |
平均 | O( n log 2 n n\log_2n nlog2n) |
空间复杂度 | 稳定性 |
---|---|
O( log 2 n \log_2n log2n) | 不稳定 |
二.算法思路
①.确定一个分界点,将序列分为左右两区间。
②.将不大于分界点的所有数集中到左区间,其余的数集中到右区间。
③.对左右两区间重复以上两步进行递归处理,直至各区间只有一个数。
三.动态演示
四.思路分析
如何将序列分成左、右两个区间?
最朴素的方法就是创建两个新的空间,将大于和不大于分界点的数分别放在这两个空间。
直接在原序列上进行划分的方法也有很多,下面就展示其中一种。
五.完整代码
#include <iostream>
using namespace std;
const int N = 10010;
int a[N];
int partition(int l, int r) //实现算法思路第二步
{
int mid = a[l + r >> 1]; //mid为分界点
int i = l - 1, j = r + 1; //i和j为左右指针
while (i < j) //利用左右指针完成区间划分
{
do i++; while (a[i] < mid);
do j--; while (a[j] > mid);
if (i < j) swap(a[i], a[j]);
}
return j;
}
void quicksort(int l, int r)
{
if (l == r) return; //当区间中内只有一个数时返回
int j = partition(l, r); //将序列划分为左右两区间
quicksort(l, j); //递归处理左区间
quicksort(j + 1, r); //递归处理右区间
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
quicksort(0, n - 1);
for (int i = 0; i < n; i++)
cout << a[i] << ' ';
return 0;
}