最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年05月29日 14:24:34   作者:玉樹銀花冬飛雪  
這篇文章主要為大家詳細介紹了C/C++實現(xiàn)三路快速排序算法原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下

書接上文,上次講到了雙路快速排序,雙路快速排序是將等于v(標志數(shù))的數(shù)也進行交換,從而避免了在處理有大量重復數(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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • VSstudio中scanf返回值被忽略的原因及解決方法(推薦)

    VSstudio中scanf返回值被忽略的原因及解決方法(推薦)

    這篇文章主要介紹了VSstudio中scanf返回值被忽略的原因及其解決方法,scanf返回值被忽略,接下來我就告訴大家該如何解決這個問題,需要的朋友可以參考下
    2022-09-09
  • c++ vector對象相關(guān)總結(jié)

    c++ vector對象相關(guān)總結(jié)

    這篇文章主要介紹了c++ vector對象的相關(guān)資料,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下
    2021-02-02
  • C++ string類getline()用法實例詳解

    C++ string類getline()用法實例詳解

    C++ getline()是一種標準庫函數(shù),用于從輸入流中讀取字符串或行,它是<string>標頭的一部分,本文介紹C++ string類getline()用法詳解,感興趣的朋友一起看看吧
    2024-03-03
  • C++11特性小結(jié)之decltype、類內(nèi)初始化、列表初始化返回值

    C++11特性小結(jié)之decltype、類內(nèi)初始化、列表初始化返回值

    這篇文章主要介紹了C++11特性小結(jié)之decltype、類內(nèi)初始化、列表初始化返回值,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • C++map,set,multiset,multimap詳細解析

    C++map,set,multiset,multimap詳細解析

    在C++標準模板庫(STL)中,容器分為關(guān)聯(lián)式容器和序列式容器兩大類,關(guān)聯(lián)式容器主要包括set、map、multiset和multimap,通過索引來訪問元素,本文給大家介紹C++?map,set,multiset,multimap的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • C/C++實現(xiàn)跨文件共享全局變量詳解

    C/C++實現(xiàn)跨文件共享全局變量詳解

    這篇文章主要為大家詳細介紹了C/C++如何實現(xiàn)跨文件共享全局變量,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • 詳解C語言#define預處理宏定義

    詳解C語言#define預處理宏定義

    本文主要介紹了C語言#define預處理宏定義,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C語言計算1/1+1/2+1/3+…+1/n的問題

    C語言計算1/1+1/2+1/3+…+1/n的問題

    這篇文章主要介紹了C語言計算1/1+1/2+1/3+…+1/n的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 一文帶你搞懂C語言動態(tài)內(nèi)存管理

    一文帶你搞懂C語言動態(tài)內(nèi)存管理

    動態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存。本文將通過幾個示例帶大家深入了解一下C語言的動態(tài)內(nèi)存管理,需要的可以參考一下
    2022-11-11
  • 實例分享cmake編譯一個簡單c++項目(demo)

    實例分享cmake編譯一個簡單c++項目(demo)

    下面通過一個小例子來說明cmake編譯一個c++項目,生成可執(zhí)行文件,需要的朋友可以參考下
    2020-02-02

最新評論

满城县| 西乌珠穆沁旗| 青岛市| 武冈市| 佳木斯市| 鄂尔多斯市| 静乐县| 嘉鱼县| 金阳县| 甘肃省| 崇仁县| 湄潭县| 灵宝市| 兰州市| 明星| 麻阳| 拉萨市| 吴江市| 通榆县| 左权县| 扎鲁特旗| 普陀区| 三江| 都匀市| 大渡口区| 高青县| 花莲县| 高碑店市| 琼结县| 哈尔滨市| 祥云县| 新龙县| 通城县| 益阳市| 崇信县| 景宁| 江阴市| 曲阜市| 淮北市| 莱州市| 龙门县|