快速排序

思想:

1.填坑和划分

以某个数为基准,一般选第一个数,从数组头尾两边开始遍历。

选出来的基准数会用一个变量保存,这样的话,这个基准数所在的数组的位置就相当于有个坑。

先从尾那边开始,找到比基准数小的,就放到左边的坑。放了之后左边的坑就填上了,右边就出现坑了。

然后又从头那边开始,找到比基准数大的,就放到右边的坑。这样子左边又出现了坑。

直到头尾相遇的时候,把基准数放到此时的坑的位置。

这样子数组就划分成了前后两部分。

2.递归

对前面一部分快排。

对后面一部分快排。

 

图解:

快速排序

 

 

代码:

void quickSort(int s[], int l, int r){
    if(l < r){
        int i = l;
        int j = r;
        int x = s[i];
        while(i < j){
            while(i < j && s[j] >= x){//从尾部开始,找到比 x 小的数
                j--;
            }
            if(i < j){
                s[i++] = s[j]; 
            }
            while(i < j && s[i] < x){//从头部开始,找到比 x 大的数
                i--;
            }
            if(i < j){
                s[j--] = s[i];
            }
        }
        s[i] = x;
        quickSort(s, l, i-1);
        quickSort(s, i+1, r);
    }
}

 

上一篇:快速排序分析和递归实现(java)


下一篇:c – Quicksort优化