快速排序(C++版本)

快速排序的思想,如果说是分治法,那也不详细,我看到一个非常适合的描述就是“挖坑填数+分治法”

        挖坑填数:就是从数组中取一个基数(就想一个标杆来和其他的数比较),赋值给temp变量,这样我们就不用担心它会丢失,就相当于我们把这个数先挖出来,留一个坑给其他的数字填充,其他的所有数都跟这个数比较,值得注意的是:如果我们取的是最左边(右边)的数,那么我们就要先从右边(开始比)。

      分治:如果按照升序排列,那么我们就需要把右边所有比基数小的数,都一个个挪到数组左边,大的放在右边。在一遍循环下来以后,我们基数就在数组中间了,比基数小的就在左边,比基数大的在基数右边,就按照这个基数,把数组拆分为两组,然后重新对两组数继续上面的方法,直到数组中只有一个元素,这个时候数组就算排列好了。

      简述过程:

              1.先从数列中取出一个数作为基准数。

                  2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

                  3.再对左右区间重复第二步,直到各区间只有一个数。

 

下面贴上代码:

#include <iostream>
using namespace std;
int a[100];

void quick_sort(int *a, int l ,int r){

    int right = r, left = l;
    if(r <= l)
        return;//这里就是判断数组是不是只有一个元素
    int x = a[l];//我们选择左边的作为基数
    while(right > left){//

        while(x <= a[right] && right > left){//先从右边比较,查找到数组右边比基数小的数的下标
            right--;
        }
        if(left < right){//做交换赋值,把小的数放在数组左边
            a[left++]=a[right];
        }

        while(x >= a[left] && right > left){//查找到数组左边比基数大的数的下标
            left++;
        }
        if(left < right){//做交换赋值,把大的数放在数组右边
            a[right--] = a[left];
        }

    }
    a[right] = x;//最后要把基数赋值到最中间的那个位置
    //对分成两组的数组分别排序
    quick_sort(a,l,right-1);
    quick_sort(a,right+1,r);
}

int main()
{
    int sizea =0;
    cin>>sizea;
    for(int i = 0;i < sizea; i++){
        cin>>a[i];
    }
    quick_sort(a,0,sizea-1);
    for(int i = 0;i < sizea; i++){
        cout<<a[i]<<"  ";
    }
    return 0;
}

如果还是看不懂的话,那推荐一篇博文

http://blog.csdn.net/morewindows/article/details/6684558    欢迎小伙伴赐教微笑

猜你喜欢

转载自we-are-here.iteye.com/blog/2158078
今日推荐