c++实现快速排序详细分析

快速排序坑挺多的,今天有空记录一下自己的实现,并加上详细的注释和举例

#include<iostream>

using namespace std;

int partion(int num[],int left,int right)
{
    int i,j,index,exchage;
    index = num[left];
    i = left; //由于while (i < j)已经决定了,如果 i = left + 1;而数组只有两个元素且j 指向的元素比较大,如 3 8 那么循环不会执行,最后还把8 和3交换了
    j = right;
    while (i<j) // 3 7 2 4 下面的sawp 执行后 变成 3 2 7 4 这时候 i 指向7 j指向2, 就不需要再循环了j就是最终位置  
    {
        while(num[i] <= index && i < right) // i < right 是为了处理 100 2 3 4 这样的情况,i 会一直扫描越界,为什么不是 i<= right,因为已经j 在right了,一定会处理那个元素
          i++;
    
        while(num[j] >= index && j > left) //j > left 是为了处理 -13 2 1 4 这样的情况,j 会一直扫描到-13的左边越界, 注意 j 是 > left, 不是>i 否则 3 8 这种情况就错了
            j--;
        
        if(i < j)
            swap(num[i++],num[j--]);//循环结束三种情况,第一种是 3 7 2 4 第二种是 3 3 1,i == right == j结束了,这时候 i j 肯定在一起,就没有必要交换了
//第三种是 3 7 9 这时候j 因为越界判断失败而退出循环,为什么越界,因为它碰到了第一个元素,这时候不能交换3 和 7 ,因为i 停在了比第一个元素大的地方
    }

     swap(num[left],num[j]);// 从小到大排序注意是 交换 j 和 index 位置!

    return j;
}
void quick_sort(int num[],int lo,int hi)
{
    if (lo<hi)
    {
        int x = partion(num,lo,hi); //对于 3 8 ,x = 0
        quick_sort(num,lo,x-1); //0 到 -1 所以要判断lo <= hi 如果是等于
        quick_sort(num,x+1,hi);//1 到 1,由于只有一个元素8,也没有必要排序了所以上面注释的lo <= hi改成 lo < hi

    }
}
int main()
{
    int a[5] = {3, 4, 2, 1, 0 };
    quick_sort(a,0,4);
     for(i=0;i<5;i++)
         cout << a[i] << endl;
    return 0;
}

 

posted on 2016-10-23 17:46  Joker_88  阅读(541)  评论(0编辑  收藏  举报

导航