數據結構自學Day13 -- 快速排序--“非遞歸利用棧實現”

一、快速排序回顧

????????快速排序本質上是**“分而治之”(Divide and Conquer)策略的遞歸應用。但遞歸其實就是函數棧的一種體現,因此我們也可以顯式使用棧(stack)來模擬遞歸過程**,從而實現非遞歸版本的快速排序。

往期“快速排序算法回顧”:

快速排序--挖坑法
快速排序-- 分而治之

快速排序--前后指針法

注意:我們這里只是利用棧來模擬遞歸過程,遞歸算法會多次開辟額外的棧幀,利用棧的實現可以有效優化,避免爆棧。

🧱 二、利用棧實現非遞歸:

  1. 創建一個棧(保存左右區間的邊界值);

  2. 把整個初始區間?[0, size-1]?入棧;

  3. 當棧不為空時:

    • 彈出一個區間?[left, right];

    • 對該區間做一次?Partition(分區);可利用前面我們學過的”前后指針“,”挖坑法“等

    • 得到劃分下標?pivot;

    • 如果?[left, pivot-1]?有效,則入棧;

    • 如果?[pivot+1, right]?有效,則入棧;

  4. 重復,直到棧為空。

思維導圖:

代碼實現:

void QuickSort_stack(int* arr,int left,int right){assert(arr);if(left>=right){return;}int size = right+1;int* stack  = (int*)malloc(2*size*sizeof(int));//建立棧int top = 0;//先入左邊,再入右邊stack[top++] = left;stack[top++] = right;while (top>0){// 先進后出,所以先出右邊int right  = stack[--top]; //注意 -- 的用法int left  = stack[--top];if(left<right){int div = PartSort2(arr,left,right); //利用分而治之的思想if(left<div-1){stack[top++] = left;stack[top++] = div-1;}if(div+1<right){stack[top++] = div+1;stack[top++] = right;}}}
}

三、遞歸以及棧調用對比

項目

遞歸版

非遞歸(棧模擬)

結構

簡潔,易讀

稍復雜,需維護棧

系統棧

占用系統調用棧

手動棧,控制更靈活

棧溢出風險

有,尤其數據近似有序

可優化,避免爆棧

應用場景

一般排序足夠

資源受限場景、控制棧深度

可改進性

難以精細控制

可結合尾遞歸優化、棧平衡策略

四、📘 總結

棧實現快速排序的核心是把遞歸中“待處理的區間”壓入一個顯式棧,依次取出處理,用 迭代方式完成原本的遞歸流程。這樣做不僅可以避免函數棧溢出,還可以為后續的性能優化提供空間。

?五、進一步優化建議

  1. 棧小區間優先處理(如先壓小區間)可以避免棧過深;

  2. 對小區間(如 <16 元素)可以切換為插入排序,提高性能;

  3. 使用“三數取中”或“隨機選主元”策略改善最壞情況;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92825.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92825.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92825.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端數據庫:IndexedDB 基礎使用

前言 在現代 Web 開發中&#xff0c;隨著應用程序復雜度的增加&#xff0c;對本地存儲的需求也越來越高。雖然 localStorage 和 sessionStorage 可以滿足一些簡單的數據存儲需求&#xff0c;但當需要存儲大量結構化數據或進行復雜查詢時&#xff0c;它們就顯得力不從心了。這時…

Kubernetes深度解析:企業級容器編排平臺的核心實踐

引言&#xff1a;Kubernetes的戰略地位與核心價值在云原生技術生態中&#xff0c;??Kubernetes??已成為容器編排的事實標準。根據2023年全球云原生調查報告&#xff1a;全球??96%?? 的組織正在使用或評估Kubernetes企業生產環境Kubernetes采用率增長??400%??&#…

Netty中future和promise用法和區別

定義與概念 Future&#xff1a;表示一個異步操作的結果。它是只讀的&#xff0c;意味著你只能查看操作是否完成、是否成功、獲取結果或者異常等信息&#xff0c;但不能主動設置操作的結果。Promise&#xff1a;是 Future 的可寫擴展。它不僅可以像 Future 一樣查看操作結果&…

微算法科技(NASDAQ:MLGO)采用分布式哈希表優化區塊鏈索引結構,提高區塊鏈檢索效率

隨著區塊鏈技術的快速發展&#xff0c;其在各個領域的應用越來越廣泛。然而&#xff0c;區塊鏈數據的存儲和檢索效率問題一直是制約其發展的瓶頸之一。為了解決這一問題&#xff0c;微算法科技(NASDAQ&#xff1a;MLGO)采用了分布式哈希表&#xff08;DHT&#xff09;技術來優化…

Jmeter的元件使用介紹:(三)配置元件詳解01

Jmeter的配置元件有非常多&#xff0c;常用的有&#xff1a;信息頭管理器、Cookie管理器、用戶定義的變量、Http請求默認值、JDBC Connection Configuration、CSV 數據文件設置、計數器等&#xff0c;本文會對這些常用的配置元件一一介紹&#xff0c;還有其他很多配置元件&…

git 連接GitHub倉庫

一、安裝 git 包在官網下載 git 包二、通過SSH密鑰與GitHub遠程倉庫連接1. 檢查本地 SSH 密鑰是否存在ls -al ~/.ssh如果看到 id_rsa 和 id_rsa.pub&#xff0c;說明已有密鑰。2.如果沒有&#xff0c;生成新的 SSH 密鑰&#xff1a;ssh-keygen -t ed25519 -C "your_email…

如何通過AI掃描代碼中的問題

代碼質量其實在需求高壓&#xff0c;業務快速迭代的場景下往往容易被人忽視的問題&#xff0c;大家的編碼習慣和規范也經常會各有喜好&#xff0c;短期之內獲取看不出來什么問題&#xff0c;但長此以往就會發現&#xff0c;屎山逐步成型了&#xff0c;而線上代碼跑著往往就不想…

Java 大視界 -- Java 大數據機器學習模型在金融衍生品市場波動特征挖掘與交易策略創新中的應用(363)

Java 大視界 -- Java 大數據機器學習模型在金融衍生品市場波動特征挖掘與交易策略創新中的應用&#xff08;363&#xff09;引言&#xff1a;正文&#xff1a;一、Java 構建的金融數據處理架構1.1 多源異構數據實時融合1.2 新聞輿情與市場沖擊建模二、Java 驅動的波動特征挖掘與…

Cartographer安裝測試與模塊開發(三)--Cartographer在Gazebo仿真環境下的建圖以及建圖與定位階段問題(實車也可參考)

參數介紹之所以要首先介紹參數而不是實操&#xff0c;是因為大部分建圖失敗、漂移基本上都是參數設置錯誤引起的&#xff0c;或者說大部分都是TF存在問題&#xff0c;主要是坐標系Frame之間有沖突或者對不上等原因導致的&#xff0c;因此把參數放在前面介紹&#xff0c;了解了參…

uniapp nvue開發App 橫豎屏切換丟失上下文導致 setTimeout和clearTimeout報錯

報錯內容如下 [JS Framework] Failed to find taskCenter (35). [JS Framework] Failed to execute the callback function:TypeError: c.clearTimeout is not a function reportJSException >>>> exception function:__WEEX_CALL_JAVASCRIPT__, exception:JavaSc…

Mirauge3D 賦能:全自動建模,讓城市規劃與建筑設計擁有高分辨率實景三維模型

在數字化浪潮席卷各行各業的當下&#xff0c;高精度、多元化的空間數據已成為基礎測繪、智慧城市建設、自然資源管理等領域高質量發展的核心支撐。從城市交通網絡的智能規劃到國土空間的優化配置&#xff0c;從災害監測的精準預警到生態環境保護的科學決策&#xff0c;空間數據…

Javaweb————學習javaweb的預備知識

??????一.javase,javaweb,javaee的區別和聯系 &#x1f499;&#x1f499;&#x1f499;javase: 通俗的來講就是java技術棧&#xff0c;做java相關開發的基礎&#xff0c;比如javaweb&#xff0c;javaee開發都是必備javase的基礎的&#xff0c;包括java語言基礎&#xff…

zabbix服務自動發現、自動注冊及配置釘釘告警(小白的“升級打怪”成長之路)

目錄 一、自動發現及自動注冊 1、自動發現 2、自動注冊規則 二、監控告警并發送電子郵件 1、設定發郵件的地址 2、設定發郵件的用戶 3、設定監控及觸發的條件 4、開始告警并設置觸發發郵件 三、釘釘告警 1、配置zabbix-server 2、配置監控及觸發 3、web頁面操作 4、…

OSPF多區域

OSPF多區域劃分的必要性 OSPF單區域存在的問題 LSDB 龐大&#xff0c;占用內存大&#xff0c;SPF計算開銷大。 LSA洪泛范圍大&#xff0c;拓撲變化影響范圍大。 路由不能被匯總&#xff0c;路由表龐大&#xff0c;查找路由開銷大 解決辦法 劃分區域可以解決上述問題 每個區域獨…

質數、因數、最大公約數經典問題整理

1、計數質數 MX 5000000 is_prime [1] * MX is_prime[0] is_prime[1] 0 for i in range(2, MX):if is_prime[i]:for j in range(i * i, MX, i):is_prime[j] 0class Solution:def countPrimes(self, n: int) -> int:return sum(is_prime[:n]) 2、序列中不同最大公約數的…

Java NIO FileChannel在大文件傳輸中的性能優化實踐指南

Java NIO FileChannel在大文件傳輸中的性能優化實踐指南 在現代分布式系統中&#xff0c;海量數據的存儲與傳輸成為常見需求。Java NIO引入的FileChannel提供了高效的文件讀寫能力&#xff0c;尤其適合大文件傳輸場景。本文從原理深度解析出發&#xff0c;結合生產環境實戰經驗…

SQLite Insert 語句詳解

SQLite Insert 語句詳解 SQLite 是一種輕量級的數據庫管理系統,它以其簡潔的設計、強大的功能和易于使用而聞名。在 SQLite 中,INSERT 語句用于向數據庫表中添加新數據。本文將詳細介紹 SQLite 的 INSERT 語句,包括其基本語法、使用方法以及一些高級特性。 基本語法 SQLi…

git更新內核補丁完整指南

Git操作完整指南 ?? 目錄 項目概述 Git基礎配置 日常操作流程 補丁更新操作 分支管理 沖突解決 常見問題 最佳實踐 命令速查表 ?? 項目概述 </

關于回歸決策樹CART生成算法中的最優化算法詳解

首先&#xff0c;一共比如有M個特征&#xff0c;N個樣本&#xff0c;對于每一個特征j&#xff0c;遍歷其中的N個樣本&#xff0c;得到N個值中&#xff0c;最小的值&#xff0c;作為這個特征的最優切分點&#xff0c;而其中的c1&#xff0c;c2是可以直接得到的。然后&#xff0c…

Ubuntu 環境下創建并啟動一個 MediaMTX 的 systemd 服務

文章目錄一、簡介二、安裝及使用三、創建系統服務小結一、簡介 MediaMTX 是一個現代、高性能、跨平臺的 流媒體服務器&#xff0c;主要用于接收、轉發、轉碼和分發 音視頻流&#xff0c;支持多種協議。它的前身是 rtsp-simple-server&#xff0c;后來重命名為 MediaMTX&#x…