快速排序

快速排序

基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

算法复杂度

最差时间复杂度\(O(N^2)\)
平均时间复杂度\(O(NlogN)\)

实现方法

首先,我们有一串序列需要排序a[10] = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
我们现在从序列里面找到一个基准数(任何数字都可以),这里选择a[0]也就是6。
我们先从找到一个小于6的数,再从找到一个大于6的数,然后交换它们。
这里可以用两个变量ij,分别指向序列的最左边和最右边,即i=6j=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;
}
posted @ 2020-05-09 15:07  RainbowBird  阅读(81)  评论(0编辑  收藏  举报