1.快排简述:
其实快速排序是我们使用最多的一种排序,因为包含快速?人们的第一直观感觉就是觉得很快速,那么当然他是相当快的一种排序,如果你的评测机快的话勉强能排1000000个数,差不多可以了,但是他是不稳定的排序,什么是不稳定排序?就是比如对下面数进行排序
3 2 2 1 5
不稳定排序就是说对于待排序的数有数值相同的时候,比如a[2] = 2, a[3] = 2但是排序过后不一定他们这两个2还是按照之前未排序前的转态存在。
我们我们以(13表示未排序前的下标和位置)
待排序:13 22 32 41 55
排序后:41 32 22 13 55
快排是很有可能会造成32 和 22他们排序后的顺序不同, 这就是不稳定排序。
2.快排过程:
分三步走:
1.选择一个标尺, 标尺一般有三种选取方法, 选最左端的数, 选最右端的数, 选中间的数, 当然还可以随机选取。
2.运用一个双指针去扫描一遍序列,将比标尺小的排到标尺左边,比标尺大的排在标尺右边。
3.因为2只能将比标尺小的放在左边比标尺大的放在右边但是对于标尺左边的数并不能保证有序,所以还需要递归地去排左区间和右区间。
针对于
3 2 2 1 5
比较常用的选取标尺的方式是选取中间(1 + 5) / 2 = 3选取第三个为标尺
第二部分
扫一遍序列
发现3是大于标尺2的,那么我们就不往左边扫,从右边扫发现1是小于标尺2的
然后交换3和1
1 2 2 3 5
3.快排常用模板:
inline void quickSort(int a[], int l, int r) {
if (l >= r) return ; //边界条件
//i为l - 1是因为我们使用的是do while循环,不管怎样循环都会走一次,j也一样
int i = l - 1, j = r + 1, x = a[l];
while (i < j) {
do i ++;
while (a[i] < x);
do j --;
while (a[j] > x);
if