快速排序就是随意找个基准数(就是一个用来参照的数,看下面就知道做什么的了)。在一个数组a[10]中随意找个数,假如这个数是a[0]=8。方法很简单,从右向左找一个小于8的数,从左向右找一个大于8的数,然后交换他们。这里可以用两个变量i和j,分别指向数列的最左面和最右面,首先j出动,因为我们这里的基准数是最左面的数,所以j先出动,然后j一步步的往左走,直到找到小于8的数;之后i一步步往右走,直到找到大于8的数,然后交换i和j指向的值。就这样交换交换交换,直到i和j相等,当i和j相等时,交换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);
}


 

相关文章:

  • 2021-10-11
  • 2021-12-28
  • 2021-10-23
  • 2021-06-27
  • 2021-11-08
猜你喜欢
  • 2021-12-28
  • 2022-12-23
  • 2022-12-23
  • 2021-12-29
  • 2022-12-23
  • 2021-09-14
  • 2021-08-28
相关资源
相似解决方案