菜鳥和你一起學“快速排序” C++實現

     生活不菜,菜鳥不菜。大家好,又和大家見面了,最近看了一下快速排序,首先說一下,快速排序的思想。

     快速排序的思想是這樣子的:它是運用了分而治之的思想,把一個問題分開成幾個小部分分別解決,然後重組。在快速排序中,n個元素被分爲三段:左段left,右段right和中段middle。中段僅包含一個元素。左段中的各個元素都小於中段的元素,右段的各元素都大於中段元素。因此left和right中的元素可以獨立排序,並且不必對left和right的排序結果進行合併(左段排好+中段+右段排好=有順序的數組,不用再合併重組)。middle中的元素被稱爲支點(pivot)。

    下面首先給大家看一下快速排序的僞代碼。

    //使用快速排序方法對a[0:n-1]排序

    從a[0:n-1]中選擇一個元素作爲middle,該元素爲支點。

    把餘下的元素分割爲兩段作爲left和right,使得left中的元素都小於等於支點,而right中的元素都大於等於支點。

    遞歸的使用快速排序方法對left進行排序。

    遞歸的使用快速排序方法對right進行排序。

    所得結果爲left+middle+right

 

    以上就是思想+僞代碼,下面舉一個例子,然後我們一起寫一下代碼。

    例如元素序列[4,8,3,7,1,5,6,2]。假設選擇元素6作爲支點,則6位於middle;4,3,1,5,2位於left;8,7位於right;當left排好序後,所得結果爲1,2,3,4,5;當right排好序後結果爲7,8。把right中的元素放在支點元素之後,left中的元素放在支點元素之前,即可得到最終的結果[1,2,3,4,5,6,7,8,]。

    下面我們一起寫一下代碼

     template<class T>

     void  QuickSort(T* a,int n)

    {//對a[0:n-1]進行快速排序

      {//要求a[n]必須有最大關鍵值

        quickSort(a,0,n-1);

        template<class T>

        void quickSort(T a[],int l,int r)

        {

          if(l<=r) return;//遞歸結束的標誌。

          int i=l;            //從左到右的遊標。

          int j=r+1;       //從右往左的遊標。

          pivot=a[l];     //設置middle的元素,一般爲將要被排序元素的第一個元素。

         

           //把左側>=pivot的元素與右側<=pivot的元素進行交換

           while(true){

             do{//在左側尋找>=pivot的元素

                 i=i+1;

                }while(a[i]<pivot);

             do{//在右側尋找<=pivot

                 j=j-1;

                 }while(a[j]>pivot);

             if(i>=j)break;//未發現交換對象

             Swap(a[i],a[j]);

          }

  

        //設置pivot

       a[l]=a[j];

       a[j]=pivot;

 

       quickSort(a,l,j-1);//對左段排序

       quickSort(a,j+1,r);//對右段排序

  }

 

     好了,講到這裏代碼就講完了,大家如果想要弄清楚裏邊的流程和思想,最好找幾個比較簡單的例子,親自跑一下,在紙上畫一畫,就簡單明瞭了~就這樣,謝謝大家。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章