快速排序(quick sort)
程序代码
#include <bits/stdc++.h>
using namespace std;
void quickSort(int* a, int left, int right) {
if (left > right) return;
int i = left, j = right;
int temp = a[i]; //选取基准数
while (i != j) { //交换中间的数
while (i < j && temp <= a[j]) j--;
while (i < j && temp >= a[i]) i++;
if (i < j) { //交换两个数
int t = a[j];
a[j] = a[i];
a[i] = t;
}
}
//交换基准数
if (i == j) {
a[left] = a[i];
a[i] = temp;
}
quickSort(a, left, i - 1);
quickSort(a, i + 1, right);
}
int main() {
int a[10], n = 0;
memset(a, 0, sizeof(a));
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
quickSort(a, 1, n);
for (int i = 1; i <= n; i++) cout << a[i] << " ";
return 0;
}
代码解释
快速排序是可以跳转进行两个数的交换,将数列划分为两个一大一小的子数列(分治),子数列继续划分,直到剩余一个数为止,这一点区别与冒泡排序。
程序从需要排序的数列中选择第一个数作为基准数,设置两个下标,分别指向数列的左端和右端,右端开始向左侧移动,找到比基准数小的数停止,左端开始向右移动,找到比基准数大的数停止,
交换两个数
此处需要注意,while循环停止有可能是找到了大数和小数,也有可能没有找到(左端下标与右端下标重合)如果重合,就不需要交换两个数了。上面两段程序实现了两个数的寻找与交换,但是我们需要将所有的数进行比较交换,直到再没有符合要求的数。
上面的程序执行完成就实现了数列的全部数的交换,但是基准数还在最开始的地方,这是我们需要将基准数与当前指向的数进行交换(当前i和j重合,肯定是由于右端移动导致的,而右端移动要嘛找到了小数,要嘛与没有移动的右端重合,此时右端指向基准数,交换没有毛病)
递归对中间数(基准数)的左端和右端数列进行同样的操作,直到剩余一个数停止
算法概念
快速排序的整体思路是 分治与递归