排序算法(二)-快速排序

快速排序就是随意找个基准数(就是一个用来参照的数,看下面就知道做什么的了)。在一个数组a[10]中随意找个数,假如这个数是a[0]=8。方法很简单,从右向左找一个小于8的数,从左向右找一个大于8的数,然后交换他们。这里可以用两个变量ij,分别指向数列的最左面和最右面,首先j出动,因为我们这里的基准数是最左面的数,所以j先出动,然后j一步步的往左走,直到找到小于8的数;之后i一步步往右走,直到找到大于8的数,然后交换ij指向的值。就这样交换交换交换,直到ij相等,当ij相等时,交换a[0]i/j指向的数。这一次的最后的结果就是8到了最终结果的正确位置。现在第一轮结束,以8为分界点,将这个数组分成两组,对这两组分别进行上述过程,直到数字全部归位。快速排序的秘诀就是每一轮将一个数归位(即将基准数排到最后结果的正确位置)。

下面将上述功能实现,看下代码能不能看懂

#include <iostream>

using namespace std;

void QuickSort(int *p,int left,int right)
{
    int *q=p;//保存数组首项的地址,因为要递归,每次都应该传这个数组的首项

    if(left>right)
        return;
    int i=left;
    int j=right;
    int temp=p[i];

    while(i<j)
    {
        while(i<j&&temp<=p[j])
            j--;
        while(i<j&&temp>=p[i])
            i++;

        if(i!=j)
        {
            int t=p[i];
            p[i]=p[j];
            p[j]=t;
        }
    }
    p[left]=p[i];
    p[i]=temp;

    p=q;//将数组首项的地址重新给p
    QuickSort(p,left,i-1);//二分法,递归
    QuickSort(p,i+1,right);
}


原文地址:https://www.cnblogs.com/mengnan/p/4890418.html