一天一算法:快速排序

       i--->   6, 5, 7, 8, 3 , 2 , 9 , 10   <----j
首先以第一个为基准值 6

1:           j从右边出发,在j移动到2的时候发现小于6,j停了下来,

                 然后i开始移动,当i移动到7的时候发现大于6,于是i也停了下来

                 然后i和j交换了他们所代表的值

                 6, 5, 7, 8, 3 , 2 , 9 , 10 -->   6, 5, 2, 8, 3 , 7 , 9 , 10

 2:          然后j继续向左移动,在移动到3的时候发现小于6,j停了下来,

                i也继续移动,当移动到8的时候发现大于6,于是i又停了下来

                i和j交换了他们所代表的值

                6, 5, 2, 8, 3 , 7 , 9 , 10   -->  6, 5, 2, 3, 8 , 7 , 9 , 10

3:             继续,j继续向左移动,当移动到3的时候i == j,循环结束

                这个时候呢,我们要把i代表的值和基准值进行交换

                6, 5, 2, 3, 8 , 7 , 9 , 10   -->  3, 5, 2, 6, 8 , 7 , 9 , 10

在这个的整个过程中呢,6我们已经找好了它的位置,我们就不在管它了,于是我们把6前后分成了2组,[3,5,2] 和[8, 7, 9, 10]

我们再继续对[3, 5, 3]和[8, 7, 9, 10]重新上面的过程,最后我们就能得到最终结果:2,3,5,6,7,8,9,10

          

#include<iostream>
using namespace std;

int a[] = {6, 5, 7, 8, 3, 2, 9, 10 };

void QuickSort(int left, int right)
{
    if (left >= right) //如果left >= right就没有必要交换了,因为本身已经排序了
        return;
    
    int guard = a[left];
    int i = left;
    int j = right;

    while (i != j) {
        while (a[j] >= guard && i < j) //保证每次要先从右边开始遍历
            j--;
        while (a[i] <= guard && i < j)
            i++;
        
        if (i < j) {
            int t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }

    a[left] = a[i]; //结束后要把基准值和当前的那个值进行交换
    a[i] = guard;

    QuickSort(left, i - 1);
    QuickSort(i+1, right);
}

int main()
{
    QuickSort(0, sizeof(a)/sizeof(int) -1);
    for (int i = 0; i < sizeof(a)/sizeof(int) ;i++ )
        cout << a[i] << " " ;
    cout << endl;
}
原文地址:https://www.cnblogs.com/457220157-FTD/p/4057187.html