簡單實用的c++快速排序模板類

來源:互聯網
上載者:User

 (一)目標
  在實際問題的解決過程中,我們發現,很多問題都可以歸結為對資料的排序和查詢。而查詢的效率則在很大程度上依賴於排序的效率;尤其是在資料量達到海量級的時候。因此,設計一個有效排序演算法是至關重要的。本文設計了一個通用的c++ quicksort 模板類。通過簡單的提供一個Data類,可以實現任意資料的快速排序演算法,提高了開發效率。
  (二)快速排序演算法的思想
  最基本的快速排序的思想是基於分治策略的:
  對於輸入的子序列L[p..r],如果規模足夠小則直接進行排序,否則分三步處理:
  1 分解(Divide):將輸入的序列L[p..r]劃分成兩個非空子序列L[p..q]和L[q+1..r], 使L[p..q]中任一元素的值不大於L[q+1..r]中任一元素的值。
  2 遞迴求解(Conquer):通過遞迴調用快速排序演算法分別對L[p..q]和L[q+1..r]進行排序。
  3 合并(Merge):由於對分解出的兩個子序列的排序是就地進行的, 所以在L[p..q]和L[q+1..r]都排好序後不需要執行任何計算L[p..r]就已排好序。
  (三)準備工作和原始碼
  1 使用vc6建立console工程
  2 加入下面的模板類:
  

template<typename DataType>//DataType是模板參數,代表了欲排序的資料類型  class QuickSortTemp   {  public:   QuickSortTemp()   {   }      ~QuickSortTemp()   {   }     public:   // 快速排序的實現,Array是要排序資料的數組,nLower,nUpper範圍是0 ~ 資料總個數-1   static void QuickSort(DataType* Array, int nLower, int nUpper)   {   // 測試是否排序完畢   if (nLower < nUpper)   {   // 分解和分別進行排序   int nSplit = Partition (Array, nLower, nUpper);//資料切分為兩個部分   QuickSort (Array, nLower, nSplit - 1);//左半部分遞迴排序   QuickSort (Array, nSplit + 1, nUpper);//右半部分遞迴排序   }   }

  
   // 切分資料為左右兩個部分,返回中間元素x的編號
   // 主要的過程就是:選擇一個元素x作為分界點,將比x大的元素放到x右邊,其餘放到x左邊。
  

 static int Partition (DataType* Array, int nLower, int nUpper)   {   int nLeft = nLower + 1;   DataType Pivot = Array[nLower];      int nRight = nUpper;      DataType Swap;   while (nLeft <= nRight)   {   while (nLeft <= nRight && Array[nLeft].CompareTo(Pivot) <= 0)   nLeft = nLeft + 1;   while (nLeft <= nRight && Array[nRight].CompareTo(Pivot) > 0)   nRight = nRight - 1;   if (nLeft < nRight)   {   Swap = Array[nLeft];   Array[nLeft] = Array[nRight];   Array[nRight] = Swap;   nLeft = nLeft + 1;   nRight = nRight - 1;   }   }      Swap = Array[nLower];   Array[nLower] = Array[nRight];   Array[nRight] = Swap;   return nRight;   }  };

  以上就實現了快速排序的模板類。
  3 資料類介面的實現
  從上面模板類的實現我們可以看出,為了使用這個模板類對某種類型的資料數組DataType * data進行排序,我們必須實現DataType的介面CompareTo(比較兩個DataType 元素a,b的大小,a>b返回1,a==b返回0,否則返回-1)。
  舉個例子來說:現在要排序二維點座標,定義大小關係是:先比較x軸座標值大小,x相同的話,由y值大小決定大小關係。即:(1,1) == (1,1) , (2,1) > (1, 10) , (3, 5) < (4, 1)。
  此外:還必須實現DataType類型的無參數的預設建構函式(因為模板類中要使用)。
  定義資料類型MyPoint如下:
  

struct MyPoint  {   MyPoint()   {   }      MyPoint(int x, int y)   {   this->x = x;   this->y = y;   }   int CompareTo(MyPoint& b)   {   if(this->x < b.x)   return -1;   else if(this->x > b.x)   return 1;   else   {   if(this->y > b.y)   return 1;   else if(this->y < b.y)   return -1;   else   return 0;   }   }   int x;   int y;  };

  (四)測試
  下面是用於測試的主函數:
  

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])  {   int nRetCode = 0;   //Point數組   MyPoint points[10] = {MyPoint(1,1), MyPoint(2,5), MyPoint(7,11), MyPoint(100,2),   MyPoint(1, 7), MyPoint(9,32), MyPoint(7, 1), MyPoint(2,2),    MyPoint(1,1), MyPoint(9,5)};   int count = 10;   //排序前   printf("before quicksort:/n");   for(int i = 0 ; i <count ; i ++)   printf("%d <-------> (%d,%d)/n", i, points[i].x, points[i].y);      //調用模板類排序   QuickSortTemp<MyPoint>::QuickSort(points, 0, count - 1);   //排序後   printf("after quicksort:/n");   for(i = 0 ; i <count ; i ++)   printf("%d <-------> (%d,%d)/n", i, points[i].x, points[i].y);   system("pause");   return nRetCode;  }

  結果輸出如下:
  before quicksort:
  0 <-------> (1,1)
  1 <-------> (2,5)
  2 <-------> (7,11)
  3 <-------> (100,2)
  4 <-------> (1,7)
  5 <-------> (9,32)
  6 <-------> (7,1)
  7 <-------> (2,2)
  8 <-------> (1,1)
  9 <-------> (9,5)
  after quicksort:
  0 <-------> (1,1)
  1 <-------> (1,1)
  2 <-------> (1,7)
  3 <-------> (2,2)
  4 <-------> (2,5)
  5 <-------> (7,1)
  6 <-------> (7,11)
  7 <-------> (9,5)
  8 <-------> (9,32)
  9 <-------> (100,2)
  請按任意鍵繼續 . . .
  (五)說明
  本文根據快速排序演算法,實現了一個c++快速排序模板類。使用這個模板類,並遵守欲排序資料類型必須實現的介面定義,就能實現對任意資料類型的快速排序。當然,本文的例子只是一個基本的引導。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.