国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C/C++實現(xiàn)三路快速排序算法原理

2020-01-26 13:27:01
字體:
供稿:網(wǎng)友

書接上文,上次講到了雙路快速排序,雙路快速排序是將等于v(標志數(shù))的數(shù)也進行交換,從而避免了在處理有大量重復(fù)數(shù)據(jù)的數(shù)組分組時的不平衡。而三路快速排序則是將等于v的數(shù)也分成一組,同樣可以解決上述問題。其原理如下:

1、采用隨機排序的方法將某個數(shù)作為分割數(shù),放在數(shù)組開頭,該數(shù)定義為v。將小于v的一段數(shù)組開頭的數(shù)索引定義為lt,將需要遍歷的數(shù)組的索引定義為i,將小于v的一段數(shù)組的索引定義為gt,數(shù)組的開頭和結(jié)尾的索引分別為lr。原理圖如下:

2、對索引i進行維護,逐個比較索引i對應(yīng)的數(shù)與v的關(guān)系。如果arr[i]<v,那么將arr[i]和arr[lt+1]交換,之后將索引ilt分別向后移動一位。如下圖藍色的e和灰綠色的那塊相交換


3、如果arr[i]=v,則將arr[i]納入等于v的那一部分,之后將索引i向后移動一位

4、如果arr[i]>v,則將arr[i]與arr[gt-1]交換位置,之后將索引gt向前移動一位,但是要注意,這時,索引i不需要移動,因為交換過來的數(shù)不知道大小,下一步還需要接著判斷。

5、按照這個流程,gt會和i重合,則結(jié)束比較的過程

6、最后,不要忘了將arr[l]和arr[lt]交換位置,注意:這里交換位置的是arr[lt]。排序完成

代碼如下:

#ifndef QUICKSORT3_H#define QUICKSORT3_H//三路快速排序算法#include <iostream> #include <stdlib.h>using namespace std;template <typename T>void __QuickSort3way(T *arr,int l,int r){ //遞歸的終止條件 if (l>=r)  { return; } else { //隨機快速排序選取的隨機值,為了避免在整體大致有序的情況下產(chǎn)生分組不平衡現(xiàn)象,使算法退化 int RAND = (rand() % (r - l) + l); swap(arr[l], arr[RAND]); T v = arr[l]; //小于v的分組的初始索引 int lt = l; //大于v的分組的初始索引 int gt = r + 1; //等于v的分組的初始索引,并且,此索引是數(shù)組遍歷值的索引 int i = l + 1; while (i<gt) {  //如果遍歷的數(shù)據(jù)小于v  if (arr[i]<v)  {  //將該數(shù)組與第一個等于v的數(shù)據(jù)交換  swap(arr[lt + 1], arr[i]);  //維護小于v的索引和待遍歷的數(shù)據(jù)的索引  lt++;  i++;  }  //如果數(shù)據(jù)大于v  else if (arr[i]>v)  {  //交換該數(shù)與大于v的第一個數(shù),但是在這里不需要維護i的索引  swap(arr[i], arr[gt - 1]);  gt--;  }  else//arr[i]==v  {  i++;//直接維護i的索引  } } //最后將數(shù)組第一個數(shù)v和小于v的最后一個數(shù)互換 swap(arr[l],arr[lt]); __QuickSort3way(arr,l,lt); __QuickSort3way(arr,gt,r); }}template <typename T>void QuickSort3way(T *arr,int n){ __QuickSort3way(arr, 0, n - 1);}#endif // !QUICKSORT3_H

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 乡宁县| 皮山县| 泸定县| 谷城县| 汝南县| 大新县| 龙陵县| 常山县| 芒康县| 鹿邑县| 邛崃市| 柏乡县| 同仁县| 三穗县| 康乐县| 安图县| 沽源县| 玉田县| 台东市| 福海县| 怀仁县| 双城市| 株洲市| 乐清市| 扶绥县| 许昌市| 新田县| 本溪市| 攀枝花市| 婺源县| 安塞县| 定南县| 平南县| 新和县| 昂仁县| 上思县| 米脂县| 龙胜| 绥棱县| 廉江市| 临夏县|