快速排序c++實現 快排C++代碼實現

来源:https://www.cnblogs.com/suibian1/archive/2019/05/07/10828976.html
-Advertisement-
Play Games

快速排序c++實現 快排C++ 第一、演算法描述 快速排序由C. A. R. Hoare在1962年提出,該演算法是目前實踐中使用最頻繁,實用高效的最好排序演算法, 快速排序演算法是採用分治思想的演算法,演算法分三個步驟 ...


快速排序c++實現 快排C++

第一、演算法描述

快速排序由C. A. R. Hoare在1962年提出,該演算法是目前實踐中使用最頻繁,實用高效的最好排序演算法,

快速排序演算法是採用分治思想的演算法,演算法分三個步驟

1.從數組中抽出一個元素作為基數v(我們稱之為劃界元素),一般是取第一個、最後一個元素或中間的元素

2.將剩餘的元素中小於v的移動到v的左邊,將大於v元素移動到v的右邊

3.對左右兩個分區重覆以上步驟直到所有元素都是有排序好。

第二、演算法實現

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 /*序列劃分函數*/ int partition(int a[], int p, int r) {   int key = a[r];//取最後一個   int i = p - 1;   for (int j = p; j < r; j++)   {     if (a[j] <= key)     {           i++;       //i一直代表小於key元素的最後一個索引,當發現有比key小的a[j]時候,i+1 後交換           exchange(&a[i], &a[j]);     }     }   exchange(&a[i + 1], &a[r]);//將key切換到中間來,左邊是小於key的,右邊是大於key的值。   return i + 1; }    void quickSort(int a[], int p, int r) {   int position = 0;   if (p<r)   {     position = partition(a,p,r);//返回劃分元素的最終位置     quickSort(a,p,position-1);//劃分左邊遞歸     quickSort(a, position + 1,r);//劃分右邊遞歸   } }    void main() {   int d[] = { 6,4,1,8,7,5 };   cout << "輸入數組 { 6,4,1,8,7,5 } " << endl;   quickSort(d, 0, 5);   print_arr(d, 6);    }

兩個輔助函數:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 void exchange(int * a, int* b) {   int temp = *a;   *a = *b;   *b = temp; } void print_arr(int *a, int size) //列印函數 {   cout << "列印數組:";   for (int i = 0; i<size; i++)  //列印數組   {     cout << a[i] << " ";   }   cout << endl << endl; }

測試輸出:

第三、演算法圖解分析

下麵我們來具體分析下程式怎麼運行的,

quickSort(d, 0, 5);代表以靠最有一個元素5作為基數,

程式初始化時候p=0,r=5,i=-1,j=0,key=5

通過上圖我們觀察到:

1.i逐漸增加,它一直代表著小於key=5的最後一個元素,j也在主鍵增加,一直到key前面一個元素停止

2.此時迴圈到了最後一個元素7,以5為基數的迴圈已經結束,此時i=1,a[i+1]=6,交換6和5交換,完成本輪迴圈

返回i+1=2,依索引2為分界線拆分2個數組,進入遞歸迴圈,執行類似上圖操作

第四、總結

快速排序之所以快,相比冒泡排序他的交換是跳躍式的,它的最差時間複雜度是O(N2) 和冒泡一樣,但是它的平均時間複雜度是O(nlog2N),是一種就地排序演算法,

看了很多別人寫的演算法介紹,還是覺的不夠清晰,於是決定自己寫一篇博文,希望能幫助需要的人快速理解,文章中的用圖是自己畫的。

這個博客不錯推薦給大家:https://blog.csdn.net/gjggj/article/details/82962102


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

-Advertisement-
Play Games
更多相關文章
  • 官網:www.fhadmin.org 工作流模塊 1.模型管理 :web線上流程設計器、預覽流程xml、導出xml、部署流程 2.流程管理 :導入導出流程資源文件、查看流程圖、根據流程實例反射出流程模型、激活掛起 3.運行中流程:查看流程信息、當前任務節點、當前流程圖、作廢暫停流程、指派待辦人 4. ...
  • 單例模式是一種設計模式,這一種設計模式的目的是使得該類在整個JVM系統中只有唯一的一個實例對象,在就java開發過程中,很多場景下會碰到這種需求,所以單例模式也是最常用的設計模式之一,下麵從以下幾個方面對單例模式進行解說。 一、單例模式的概念: 需要設計一個類,達到的效果:在類的整個應用中指存在一個 ...
  • 編程語言集成了發佈訂閱 很多編程語言框架里都提供了發佈訂閱的組件,或者叫事件處理機制,而spring框架對這個功能也有支持,主要使用 實現訂閱,使用 使用發佈。這種系統集成的我們先叫它“集成組件” 與語言無關的消息隊列 事實上,發佈訂閱真的與開發語言沒有什麼關係,所以出現了另一種產品,消息中間件,或 ...
  • 首先會看懂UML UML類圖與類的關係詳解 虛線箭頭指向依賴;實線箭頭指向關聯;虛線三角指向介面;實線三角指向父類;空心菱形能分離而獨立存在,是聚合;實心菱形精密關聯不可分,是組合; 上面是UML的語法。在畫類圖的時候,理清類和類之間的關係是重點。類的關係有泛化(Generalization)、實現 ...
  • 前言 前幾天,在食堂吃飯,本來每天中午的新聞三十分換成了視頻監控。我們已經習慣了,前十分鐘看著領導都很忙,中間十分鐘中國人民都很幸福,後十分鐘別的國家都生活在水深火熱里,順便跟同事談談國家大事。突然主角換成了我們自己,便毫無抬頭的欲望。 恰巧最近也有在接觸大屏監控的解決方案,於是乎,就索性拿樹莓派實 ...
  • 所屬網站分類: 資源下載 > python電子書 作者:today 鏈接:http://www.pythonheidong.com/blog/article/448/ 來源:python黑洞網 內容簡介 本書是對以數據深度需求為中心的科學、研究以及針對計算和統計方法的參考書。本書共五章,每章介紹一到 ...
  • 今天整理一下自己的基礎篇輸入和輸出的理解,自己沒有研究系統輸入和輸出函數,以後有時間在去深究,之前在別人的博客裡面看到這麼一句話分享給大家,“學習就是一個不斷抄襲,模仿,練習和創新的一個過程”。 使用VC2015 1.創建項目,【文件】》【新建】》【項目】 2.項目類型為【Win32控制台應用程式】 ...
  • 01 內容大綱 1. 基礎數據類型的補充 2. 數據類型之間的轉換 3. 編碼的進階 02 具體內容: 數據類型的補充: str 元組 列表 字典 數據類型的轉換 int bool str 三者轉換 str list 兩者轉換 list set 兩者轉換 str bytes 兩者轉換 所有數據都可以 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...