快速排序
基本思想
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
算法复杂度
最差时间复杂度(O(N^2))
平均时间复杂度(O(NlogN))
实现方法
首先,我们有一串序列需要排序a[10] = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
。
我们现在从序列里面找到一个基准数(任何数字都可以),这里选择a[0]也就是6。
我们先从右往左找到一个小于6
的数,再从左往右找到一个大于6
的数,然后交换它们。
这里可以用两个变量i
和j
,分别指向序列的最左边和最右边,即i=6
,j=8
。
可以尝试画图进行理解。
#include <iostream>
using namespace std;
int n, a[101];
void qsort(int left, int right) {
if (left > right) return;
int i = left, j = right, temp = a[left];
while (i != j) {
while (a[j] >= temp && i < j) j--; // 当a[j]大于等于基准数,j向前走一位
while (a[i] <= temp && i < j) i++; // 当a[i]小于等于基准数,i向后走一位
if (i < j) swap(a[i], a[j]); // 当a[i]>a[j]时,交换这两个数
}
swap(a[left], a[i]); // 交换基准数和a[i],a[i]是中间一个没有被交换的数
qsort(left, i - 1); // 继续排左边的
qsort(i + 1, right); // 继续排右边的
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
qsort(0, n - 1); // 从0开始到n-1结束
for (int i = 0; i < n; i++) cout << a[i] << " ";
return 0;
}