對快速排序的理解以及相關c++代碼

来源:https://www.cnblogs.com/yang901112/archive/2019/08/10/11332763.html
-Advertisement-
Play Games

快速排序:在一組數據中,可以將左邊的數字當作樞軸(右邊也可以),接下來要做的就是,先從右邊找到比樞軸小的數, 再從左邊找到比樞軸大的數,接著將這兩個數進行交換,重覆上述步驟找出所有符合條件的數進行交換, 最後將樞軸放到比樞軸大的數與比樞軸小的數之間。之所以要從右邊開始找,並且找到比樞軸小的數是因為交 ...


快速排序:在一組數據中,可以將左邊的數字當作樞軸(右邊也可以),接下來要做的就是,先從右邊找到比樞軸小的數,

再從左邊找到比樞軸大的數,接著將這兩個數進行交換,重覆上述步驟找出所有符合條件的數進行交換,

最後將樞軸放到比樞軸大的數與比樞軸小的數之間。之所以要從右邊開始找,並且找到比樞軸小的數是因為交換後小的數就在樞軸的左邊了。

下麵舉個比較特殊的例子希望能增加理解。

 

1

9

8

5

6

7

3

2

0

4

先從右往左找到比1小的第一個數字為0,此時的索引位置j=8,再從左往右找到比1大的第一個數字為9,此時的索引位置i=1,此時交換0和9,

1

0

8

5

6

7

3

2

9

4

繼續下一次重覆任務

先從右往左找到比1小的第一個數字為0,此時的索引位置,j=1,而從左往右找到比1大的第一個數字8此時的索引i=2,很明顯i>j,這是不允許的,

所以這時候就可以讓所選的樞軸1與j位置上的值交換(也就是把樞軸放到兩組數字中間)

0

1

8

5

6

7

3

2

9

4

先看1左邊的情況此時就一個數字1已經排好,

再看右邊的情況,從j+1的位置開始到最後,且以j+1的位置為樞軸,

從右邊找比8小的第一個數字為4,索引j=9,從左邊找比8大的第一個數字為9,索引i=8,交換4和9

8

5

6

7

3

2

4

9

按照上述邏輯繼續

9

5

6

7

3

2

8

9

 

8的左邊

 

4

5

6

7

3

2

從右往左找比4小的數字,從左往右找比4大的數字,並交換

4

2

6

7

3

5

繼續

4

2

3

7

6

5

繼續

3

2

4

7

6

5

8的左邊又被4分成兩段

8的右邊

9

 

 

4的左邊

3

2

 

2

3

 

4的右邊

7

6

5

這一次同樣以左邊為樞軸,從右邊找到5,左邊會一直找知道找到5所在的位置此時j=i

跳出迴圈直接把7與j的位置交換,讓樞紐7將這3個數分開,實際上7的右邊沒有值了

只需考慮7的左邊

5

6

7

 

所以最終就排好了

0

1

2

3

4

5

6

7

8

9

以下是c++帶模版的快速排序代碼

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 template<class T>
 6 void QuickSort(T *q, int left, int right);
 7 
 8 int main()
 9 {
10     int a[]={1,9,8,5,6,7,3,2,0,4};
11     QuickSort(a, 0, 9);
12     for(int i=0; i<10; i++)
13         cout << a[i] << endl;
14     return 0;
15 }
16 
17 template<class T>
18 void QuickSort(T *q, const int left, const int right)
19 {
20     if(left<right)
21     {
22         int i=left, j=right;
23         int temp = q[left];
24         while(i<j)
25         {
26             while(q[j]>=temp && i<j)
27             {
28                 j--;
29             }
30             while(q[i]<=temp && i<j)
31             {
32                 i++;
33             }
34             swap(q[i],q[j]);
35         }
36         swap(q[left], q[j]);
37         QuickSort(q, left, j-1);
38         QuickSort(q, j+1, right);
39     }
40 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 開發板:正點原子STM32F4探索者 (2019-08-10 22:04:39) 開發環境:MDK5.28.0.0 + STM32CubeMX5.3.0 + STM32CubeF4 V1.24.0 內容:使用STM32Cube配置LED0和UART1,實現LED0閃爍和UART1發送 STM32Cu ...
  • 學習環境:Windows10 + QT5.13 + QT Creater4.9.1(2019-08-10 22:02:30) 1.基本工程創建操作 常規操作創建畫面,可選擇QDialog、MainWindow、QWidget三種類型。可選擇直接創建相應的 ui 文件,控制項的添加可以在編輯模式下使用代 ...
  • 類和對象 java 是面向對象的語言 即 萬物皆對象c語言是面向過程語言 一、怎麼去描述一個對象? (1)..靜態的(短時間內不會改變的東西) 例如:外觀,顏色,品牌 (2).動態的(動作) 可以乾什麼:播放音樂,電影 二、java中,描述一個對象從兩方面出發 (1).靜態(屬性)姓名 年齡 籍貫 ...
  • 首先我們先來看看Map集合獲取元素的三種常見方法(1)entrySet(),(2)keySet(),(3)values() 1. entrySet():(1)先返回map集合的所有"映射"的Set集合,這裡規範每個"映射"的類型為Map.Entry<K, V> (2)再通過迭代取出所有的“映射”,再 ...
  • 答案:階梯數為119。 note:該題的答案,只有119,即程式中的 i 的限定值放大至無限大,最終只有當 i = 16,即 x = 7*(16+1) = 119時,才是正確答案。有興趣的同學可以自己親測一下。 ...
  • 點乘和矩陣乘的區別: 1)點乘(即“ \ ”) 各個矩陣對應元素做乘法 若 w 為 m\ 1 的矩陣,x 為 m\ n 的矩陣,那麼通過點乘結果就會得到一個 m\ n 的矩陣。 若 w 為 m\ n 的矩陣,x 為 m\ n 的矩陣,那麼通過點乘結果就會得到一個 m\ n 的矩陣。 w的列數 只能為 ...
  • 題目鏈接 FZU - 2295 Human life 題目分析 題意:你在玩一個游戲,在其中你可以通過學習一些技能,但是學習某些技能之前,可能還要學習一些其他的技能,並且學習任何技能都有一定的花費; 而我們可以通過掌握某些工作以獲取報酬,為了掌握這一工作,我們必須學會特定的技能。 不過有些工作彼此之 ...
  • 時隔一年多,在掌握了Spring、SpringBoot、SpringCloud之後 我再次回頭,重新學習Spring框架 Bean的生命周期學習: 在傳統的XML配置中,可以這樣自定義初始化和銷毀方法: 註解方式的簡單使用: 註意:要有close方法,否則不會列印Car銷毀方法 列印如下: 這裡預設 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...