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

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

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

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

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

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


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

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

5、按照這個(gè)流程,gt會(huì)和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
 {
 //隨機(jī)快速排序選取的隨機(jī)值,為了避免在整體大致有序的情況下產(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ù)組與第一個(gè)等于v的數(shù)據(jù)交換
  swap(arr[lt + 1], arr[i]);
  //維護(hù)小于v的索引和待遍歷的數(shù)據(jù)的索引
  lt++;
  i++;
  }
  //如果數(shù)據(jù)大于v
  else if (arr[i]>v)
  {
  //交換該數(shù)與大于v的第一個(gè)數(shù),但是在這里不需要維護(hù)i的索引
  swap(arr[i], arr[gt - 1]);
  gt--;
  }
  else//arr[i]==v
  {
  i++;//直接維護(hù)i的索引
  }
 }
 //最后將數(shù)組第一個(gè)數(shù)v和小于v的最后一個(gè)數(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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

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

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

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

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

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

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

    C++map,set,multiset,multimap詳細(xì)解析

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

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

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

    詳解C語言#define預(yù)處理宏定義

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

    C語言計(jì)算1/1+1/2+1/3+…+1/n的問題

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

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

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

    實(shí)例分享cmake編譯一個(gè)簡(jiǎn)單c++項(xiàng)目(demo)

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

最新評(píng)論

衢州市| 建始县| 吉林省| 广宁县| 花莲县| 香港| 明星| 自贡市| 平乐县| 大方县| 万年县| 玛纳斯县| 武清区| 当涂县| 富川| 绥芬河市| 定安县| 井研县| 鞍山市| 临夏市| 东乌珠穆沁旗| 民权县| 宜宾县| 岳池县| 峨边| 方正县| 甘南县| 隆林| 敦化市| 张家港市| 石景山区| 昂仁县| 延长县| 岳普湖县| 鸡泽县| 伊金霍洛旗| 饶平县| 三门县| 乌审旗| 班戈县| 克山县|