差点搞不懂快排

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <ctime>

using namespace std;

const int NUM = 25;

/**
    这里默认使用的pivot是a[left]
    partition将 a[]分成两部分,左边的部分小于pivot,右边的部分大于pivot

**/

///两种partition方式都是对的
/*
int partition(int a[],int left, int right) //分割
{
    int base=a[left];    //基准元素
    while(left < right)
    {
        while(left < right && a[right] >= base)
            --right;     //从右向左找第一个比基准小的元素

        a[left]=a[right];

        while(left < right && a[left] <= base )
            ++left;      //从左向右找第一个比基准大的元素

        a[right]=a[left];
    }  ///不会像下面一个一样产生交叉,因为在每个while循环里面都保证了这一点

    a[left]=base;
    return left;
}
*/

int partition(int a[],int left, int right)
{
 int L = left;
 int R = right;
 while(left < right)
 {
     ///两个内层循环的方式left和right这两个下标会产生交叉
  while(a[left] <= a[L] && left != R)///每次找出一个比pivot大的下标
   left++;

  while(a[right] >= a[L] && right != L)///每次找出一个比pivot小的下标
   right--;

  std::swap(a[left],a[right]);///交换这两个数,注意最后一次交换的时候left 和 right发生了交叉
 }
 std::swap(a[left],a[right]);///交叉的下标对应的元素不用交换,使用下面一步来完成一次分割
 std::swap(a[L],a[right]);///因为此时a[right] 是小于 pivot的,所以需要交换
 return right;
}

void QuickSort(int a[],int left,int right)
{
    int i;
    if(left<right)
    {
        i=partition(a,left,right);   //分割
        QuickSort(a,left,i-1);     //将两部分分别排序
        QuickSort(a,i+1,right);
    }
}


int main()
{

 int a[NUM] = {0};

    srand(time(NULL));
 for(int i = 0; i < NUM; i++)
        a[i] = rand() % 100;
      // a[i] = i ;

    random_shuffle(a,a+NUM);

    for(int i = 0; i < NUM; i++)
 {
  cout << a[i] << " ";
 }
    cout << endl;


 QuickSort(a, 0, NUM - 1);

 for(int i = 0; i < NUM; i++)
 {
  cout << a[i] << " ";
 }
 cout<<endl;

    return 0;
}

 
原文地址:https://www.cnblogs.com/zhuyp1015/p/2481934.html