【算法】快速排序、歸并排序(非遞歸版)

目錄

一、快速排序(非遞歸)

1.原理

2.實現

2.1 stack

2.2 partition(array,left,right)

2.3 pivot - 1 > left

二、歸并排序(非遞歸)

1.原理

2.實現

2.1 gap

2.1.1 i += 2*gap

2.1.2 gap *= 2

2.1.3 gap < array.length

2.2 left、mid、right

2.2.1 left = i

2.2.2 mid >= array.length


前言:

?在看快速排序的非遞歸實現之前,可以先看看快速排序用遞歸實現的版本:【算法】快速排序(遞歸實現),里面有詳細介紹下面講到的基準排序,基準排序是快速排序實現的基礎,最好先去了解下再往下看

遞歸實現歸并排序的也獻上【算法】歸并排序(遞歸實現)

一、快速排序(非遞歸)

1.原理

  • 在每一個待排元素所確定在的待排序區間內把待排序元素用基準排序一個個排好等到把所有待排序區間對應的一個個待排序元素都排好后,整個數組就排好了

(在區間內進行基準排序時,默認以區間第一個元素為待排序元素)

用基準排序把每一個元素在對應已知的待排序范圍排好,因為每排好一個元素,此元素排序位置確定且其排出的左小右大性質能縮小剩余的元素的待排序范圍區域,所以每當一個元素排好后,其余元素對應的已知待排序范圍就會發生變化,所以元素所在的待排序區域是經過動態變化來的


2.實現

    public static void quickSortNonR(int[] array) {Stack<Integer> stack = new Stack<>();//2.1int left = 0;int right = array.length-1;int piovt = partition(array,left,right);//2.2if(piovt - 1 > left) {//2.3stack.push(left);stack.push(piovt-1);}if(piovt + 1 < right) {stack.push(piovt+1);stack.push(right);}while (!stack.isEmpty()) {right = stack.pop();left = stack.pop();piovt = partition(array,left,right);if(piovt - 1 > left) {stack.push(left);stack.push(piovt-1);}if(piovt + 1 < right) {stack.push(piovt+1);stack.push(right);}}}//2.2基準排序挖坑法實現:private static int partition(int[] array,int left,int right) {int key = array[left];while (left < right) {while (left < right && array[right] >= key) {right--;}//right下標元素一定比key小array[left] = array[right];while (left < right && array[left] <= key) {left++;}//left下標元素一定比key大array[right] = array[left];}array[left] = key;return left;}

2.1 stack

利用棧的動態進出存儲刪取管理這些動態區間


2.2 partition(array,left,right)

partition方法是默認拿待排序區間的第一個元素為基準完成該元素在待排序區間內排好的


2.3 pivot - 1 > left

說明剩下的左邊的待排序區域至少有兩個元素,還是需要去進行基準排序的


二、歸并排序(非遞歸)

1.原理

一輪輪去有序數組gap的兩兩合并去合并的有序數組單位會越來越大,直到最后一次兩兩合并后成的是整體數組的一個有序數組,數組就整體排好序了


2.實現

    public static void mergeSortNor(int[] array) {int gap = 1;//2.1while (gap < array.length) {//2.1.3for (int i = 0; i < array.length; i += 2*gap) {//2.1.1int left = i;//2.2.1int mid =left+gap-1;int right = mid+gap;if(mid >= array.length) {//2.2.2mid = array.length-1;}if(right >= array.length) {right = array.length-1;}merge(array,left,right,mid);}gap *= 2;//2.1.2}}private static void merge(int[] array, int left, int right, int mid) {int s1 = left;int s2 = mid+1;int[] tmpArr = new int[right-left+1];int k = 0;//證明兩個區間都同時有數據的while (s1 <= mid && s2 <= right) {if(array[s2] <= array[s1]) {tmpArr[k++] = array[s2++];}else {tmpArr[k++] = array[s1++];}}while (s1 <= mid) {tmpArr[k++] = array[s1++];}while (s2 <= right) {tmpArr[k++] = array[s2++];}//tmpArr里面一定是這個區間內有序的數據了for (int i = 0; i < tmpArr.length; i++) {array[i+left] = tmpArr[i];}}

2.1 gap

每輪去兩兩合并的單有序數組的元素個數,最開始的單位有序數組長度是1


2.1.1 i += 2*gap

一輪中往后繼續去合并下一對的兩gap有序數組


2.1.2 gap *= 2

一輪全部兩兩合并完后gap單位有序數組長度已翻倍


2.1.3 gap < array.length

gap >= array.length時,繼續去有序數組合并也都只有一個靠前的左數組(整體數組),去合并也是沒有變化了,且其實在gap >= array.length之前就一定有最后一次的兩兩合并成整體有序數組的了


2.2 left、mid、right

  • [left,mid] —> 兩合并數組中靠前gap長度有序數組
  • (mid,right] —>?兩合并數組中靠后gap長度有序數組

2.2.1 left = i

i < array.length,再進來的left是一定是left < array.length的


2.2.2 mid >= array.length
  • 如果mid <?array.length 但 right >=?array.length

左右兩數組靠前的正常滿足gap長度,靠后的不足gap長度,merge合并時也是正常合并

  • 如果mid >=?array.length - 1

只有一個靠前的左數組,merge合并后還是它沒變的左數組

三、排序總結

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

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

相關文章

CasualLanguage Model和Seq2Seq模型的區別

**問題1&#xff1a;**Causal Language Modeling 和 Conditional Generation 、Sequence Classification 的區別是什么&#xff1f; 因果語言模型(Causal Language Model)&#xff1a; 預測給定文本序列中的下一個字符&#xff0c;一般用于文本生成、補全句子等&#xff0c;模型…

【計算機視覺】三維視覺項目 - Colmap二維圖像重建三維場景

COLMAP 3D重建 項目概述項目功能項目運行方式1. 環境準備2. 編譯 COLMAP3. 數據準備4. 運行 COLMAP 常見問題及解決方法1. **編譯問題**2. **運行問題**3. **數據問題** 項目實戰建議項目參考文獻 項目概述 COLMAP 是一個開源的三維重建軟件&#xff0c;專注于 Structure-from…

狀態管理最佳實踐:Bloc架構實踐

狀態管理最佳實踐&#xff1a;Bloc架構實踐 引言 Bloc (Business Logic Component) 是Flutter中一種強大的狀態管理解決方案&#xff0c;它基于響應式編程思想&#xff0c;通過分離業務邏輯和UI表現層來實現清晰的代碼架構。本文將深入探討Bloc的核心概念、實現原理和最佳實踐…

Python多任務編程:進程全面詳解與實戰指南

1. 進程基礎概念 1.1 什么是進程&#xff1f; 進程(Process)是指正在執行的程序&#xff0c;是程序執行過程中的一次指令、數據集等的集合。簡單來說&#xff0c;進程就是程序的一次執行過程&#xff0c;它是一個動態的概念。 想象你打開電腦上的音樂播放器聽歌&#xff0c;…

Linux 網絡基礎(二) (傳輸協議層:UDP、TCP)

目錄 一、傳輸層的意義 二、端口號 1、五元組標識一個通信 2、端口號范圍劃分 3、知名端口號&#xff08;Well-Know Port Number&#xff09; &#xff08;1&#xff09;查看端口號 4、綁定端口號數目問題 5、pidof & netstat 命令 &#xff08;1&#xff09;ne…

得佳勝哲訊科技 SAP項目啟動會:膠帶智造新起點 數字轉型新征程

在全球制造業加速向數字化、智能化轉型的浪潮中&#xff0c;膠帶制造行業正迎來以“自動化生產、數據化運營、智能化決策”為核心的新變革。工業互聯網、大數據分析與智能裝備的深度融合&#xff0c;正推動膠帶制造從傳統生產模式向“柔性化生產精準質量控制全鏈路追溯”的智慧…

大數據學習棧記——MapReduce技術

本文介紹hadoop中的MapReduce技術的應用&#xff0c;使用java API。操作系統&#xff1a;Ubuntu24.04。 MapReduce概述 MapReduce概念 MapReduce是一個分布式運算程序的編程框架&#xff0c;核心功能是將用戶編寫的業務邏輯代碼和自帶默認組件整合成一個完整的分布式運算程序…

Centos9 離線安裝 MYSQL8

centos 9 離線安裝 mysql 8 參考教程 1. 官網下載mysql 下載地址 2. 將文件傳輸到Centos中解壓 軟件全部安裝到了/opt中 在opt中新建mysql目錄&#xff0c;解壓到mysql目錄中 tar -xvf mysql壓縮文件 mysql[rootcentoshost mysql]# ls mysql-community-client-8.4.5-1.e…

helm的go模板語法學習

1、helm chart 1.0、什么是helm&#xff1f; 介紹&#xff1a;就是個包管理器。理解為java的maven、linux的yum就好。 安裝方法也可參見官網&#xff1a; https://helm.sh/docs/intro/install 通過前面的演示我們知道&#xff0c;有了helm之后應用的安裝、升級、查看、停止都…

display的一些學習記錄

收集的SDM的log&#xff1a; 01-01 00:00:15.311 933 933 I SDM : Creating Display HW Composer HAL 01-01 00:00:15.311 933 933 I SDM : Scheduler priority settings completed 01-01 00:00:15.311 933 933 I SDM : Configuring RPC threadpool 0…

【Rust 精進之路之第2篇-初體驗】安裝、配置與 Hello Cargo:踏出 Rust 開發第一步

系列&#xff1a; Rust 精進之路&#xff1a;構建可靠、高效軟件的底層邏輯 **作者&#xff1a;**碼覺客 發布日期&#xff1a; 2025-04-20 引言&#xff1a;磨刀不誤砍柴工&#xff0c;裝備先行&#xff01; 在上一篇文章中&#xff0c;我們一起探索了 Rust 誕生的緣由&…

【深度學習】計算機視覺(17)——ViT理解與應用

文章目錄 Embedding1 概念2 Q&A &#xff08;1&#xff09;3 Positional Encoding4 Q&A &#xff08;2&#xff09; ViT樣例及Embedding可視化理解1 簡化ViT練習2 CLS Token3 Embedding可視化4 多頭注意力可視化 Embedding技術體系結構參考來源 在研究中對特征的編碼和…

肖特基二極管詳解:原理、作用、應用與選型要點

一、肖特基二極管的基本定義 肖特基二極管&#xff08;Schottky Diode&#xff09; 是一種基于金屬-半導體結&#xff08;肖特基勢壘&#xff09;的二極管&#xff0c;其核心特性是低正向壓降&#xff08;Vf≈0.3V&#xff09;和超快開關速度。 結構特點&#xff1a;陽極采用金…

DeepSeek在數據倉庫的10大應用場景

一、智能數據集成與清洗 多源數據整合&#xff1a;DeepSeek能夠從多種數據源中提取、轉換和加載數據&#xff0c;實現跨系統數據的高效整合。 數據清洗與標準化&#xff1a;通過智能算法自動識別并糾正數據中的錯誤、不一致性和缺失值&#xff0c;提升數據質量。 二、數據倉…

提示詞構成要素對大語言模型跨模態內容生成質量的影響

提示詞構成要素對大語言模型跨模態內容生成質量的影響 提示詞清晰度、具象性與質量正相關 限定指向性要素優于引導指向性要素 大語言模型生成內容保真度偏差 以訊飛星火大模型為實驗平臺,選取100名具備技術素養的人員,從提示詞分類、構成要素和實踐原則歸納出7種提示詞組…

BeautifulSoup 庫的使用——python爬蟲

文章目錄 寫在前面python 爬蟲BeautifulSoup庫是什么BeautifulSoup的安裝解析器對比BeautifulSoup的使用BeautifulSoup 庫中的4種類獲取標簽獲取指定標簽獲取標簽的的子標簽獲取標簽的的父標簽(上行遍歷)獲取標簽的兄弟標簽(平行遍歷)獲取注釋根據條件查找標簽根據CSS選擇器查找…

關于MacOS使用Homebrew的詳細介紹

Homebrew 是 macOS&#xff08;和 Linux&#xff09;上最流行的包管理工具&#xff08;Package Manager&#xff09;&#xff0c;用于快速安裝、更新和管理各種開發工具、命令行程序、開源軟件等。它類似于&#xff1a; Ubuntu/Debian 的 aptCentOS/RHEL 的 yumWindows 的 Cho…

最新扣子空間實操指南

一、首先要先獲取到內部測試的邀請碼&#xff0c; 我們先打開扣子空間官網&#xff1a;https://space.coze.cn/ 輸入邀請碼后進入該頁面&#xff1a; 它這里支持文件上傳&#xff0c;擴展里面有很多插件&#xff0c;頁支持MCP各種插件. 探索模式有兩種&#xff0c;一種是ai自…

ubuntu22.04安裝dukto

1.添加源 sudo add-apt-repository ppa:xuzhen666/dukto2.進行更新和安裝 sudo apt update sudo apt install dukto3.報錯 $ sudo apt install dukto 正在讀取軟件包列表... 完成 正在分析軟件包的依賴關系樹... 完成 正在讀取狀態信息... 完成 您也許需要…

Java編程基礎(第四篇:字符串初次介紹)

前言 HelloWorld寫的多了&#xff0c;語法熟悉一點了吧&#xff0c;其中有段代碼還沒介紹&#xff0c;它就是字符串 public class HelloWorld { public static void main(String[] args) { printBaby(); } static void printBaby() { System.out.print("baby"); } } …