快速排序——分治

  我之前有写过相关快速排序的,但是因为当时对递归和分治的思维还是不够熟悉。所以对快速排序一知半解,现在再来做一个总结:

  首先快速排序步骤如下:

  1,设k = a[0],将k挪到适当的位置,使得比k小的元素在k的左边,比k大的元素在k的右边,和k是相等的,不关心在k左右均可。

  2,对k的左边进行快速排序

  3,对k的右边进行快速排序。

后面对过程进行一步步的分析:

快速排序——分治

 

  k就是开头的红色的数字,j其实就是最尾巴的一个数字。现在就是要把j与i来比较,如果a[j]对应的值是大于k的值的话,那就不进行交换,进行j--。

 快速排序——分治

 

现在j到了2的位置,2是小于k的所以进行交换。进行了一次交换后(现在是进行了一次奇数次的交换),就开始i往前走了(现在转尾偶数次了)。

快速排序——分治

 

知道找到了一个8了进行交换(现在是偶数次的交换了),偶数次的交换时左往右交换。现在又是从右边开始往里找了。

快速排序——分治

 

现在就是第一次快速排序进行完了的时候。后面写一下快速排序的代码。

代码:

void QuickSort(int a[],int s,int e){
    int i = s;
    int j = e;
    //如果一开始传进来的s和e 是不合格的话就直接return掉 
    if(s >= e ){
        return;
    }
    int k = a[0];
    while(i !=j ){
        while(j > i && a[j]>=k){
            j--;
        }
        //注意每次都是先进行 右边的交换 
        swap(a[i],a[j]);
        while(j<i && a[i] <= k){
            i++;
        }
        //右边的交换完了之后在进行左边的交换。 
        swap(a[i],a[j]);
    }//这个i这个循环结束了就是中间的位置 
    QuickSort(a,s,i-1);
    //对左边进行快速排序 
    QuickSort(a,i+1,e);
    //对右边进行快速排序 
}

 

上一篇:蓝桥杯单片机——矩阵键盘(6)


下一篇:XKC's basketball team(单调栈+二分)