常見排序算法總結 (四) - 快速排序與隨機選擇

快速排序

算法思想

每一輪在數組相應的范圍上隨機找一個元素進行劃分,將不大于它的所有元素都放到左邊,將大于它的元素都放到右邊。在左右兩個子數組上不斷地遞歸,直到整個數組上有序。
注意:實現時選擇的時參考荷蘭國旗問題優化后的快排算法,它會在一次劃分中維護一個包含所有等于劃分標準元素的區間,保證小于該數的都在區間左側,大于該數的都在區間右側。這樣的做法,在一定程度上能夠減少劃分次數。

穩定性分析

快速排序是不穩定的,它涉及到拆分區間,無法保證相等的數一定在同一個區間上被處理完成,也就無法保證它們的相對次序不發生變化。

具體實現

// 交換數組中的兩個元素
private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}// 全局變量 first 表示等于當前元素的第一個下標位置,last 表示最后一個
public static int first, last;private void quickSort(int[] arr, int left, int right) {// 無法構成區間,直接返回if (left >= right) {return;}// 在合法范圍內隨機一個元素作為劃分標準int pivot = arr[left + (int) (Math.random() * (right - left + 1))];// 劃分并遞歸處理左右子數組partition(arr, left, right, pivot);quickSort(arr, left, first - 1);quickSort(arr, last + 1, right);
}public void partition(int[] arr, int left, int right, int pivot) {first = left;last = right;int cur = left;while (cur <= last) {if (arr[cur] == pivot) {cur++; // 當前元素等于劃分標準,不作處理并后移指針} else if (arr[cur] < pivot) {swap(arr, first++, cur++); // 小于劃分標準,交換且分別后移兩個指針} else {swap(arr, cur, last--); // 大于劃分標準,交換并前移記錄最后一個當前元素的指針}}
}

隨機選擇

算法思想

隨機選擇是基于快排的劃分操作,能夠快速地確定一個數在數組中排序后的理論位置。這部分內容其實和排序關系不大,但是與快排有很大的關聯,可以放在一起整理。

實踐案例:Leetcode 215. 數組中的第K個最大元素

class Solution {public int findKthLargest(int[] nums, int k) {return randomizedSelect(nums, nums.length - k);}// 全局變量 first 表示等于當前元素的第一個下標位置,last 表示最后一個public static int first, last;public int randomizedSelect(int[] arr, int cur) {int res = 0;for (int left = 0, right = arr.length - 1; left <= right;) {partition(arr, left, right, arr[left + (int) (Math.random() * (right - left + 1))]);if (cur < first) {right = first - 1;  // 當前下標小于維護的第一個下標,到左邊區間中找} else if (cur > last) {left = last + 1; // 當前下標大于維護的最后一個下標,到右邊區間中找} else {res = arr[cur]; // 當前下標在維護的范圍內,記錄結果break;}}return res;}// 交換數組中的兩個元素private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}public void partition(int[] arr, int left, int right, int pivot) {first = left;last = right;int cur = left;while (cur <= last) {if (arr[cur] == pivot) {cur++; // 當前元素等于劃分標準,不作處理并后移指針} else if (arr[cur] < pivot) {swap(arr, first++, cur++); // 小于劃分標準,交換且分別后移兩個指針} else {swap(arr, cur, last--); // 大于劃分標準,交換并前移記錄最后一個當前元素的指針}}}
}

梳理總結

快速排序的理論復雜度是 O ( N l o g N ) O(NlogN) O(NlogN),它通過劃分來不斷減小問題規模從而快速解決問題。但是實踐中存在能使快排退化到 O ( N 2 ) O(N ^ 2) O(N2) 的陰間待排序列,因此需要通過隨機劃分標準這個手段來讓時間復雜度盡可能地穩定在 O ( N l o g N ) O(NlogN) O(NlogN)
隨機選擇算法,本質上是根據不同的標準,維護相應的數值區間。它能夠在理論實踐復雜度 O ( N ) O(N) O(N) 且不需要額外空間的情況下找出數組中第 K K K 大的數。

后記

使用 Leetcode 912. 排序數組 進行測試,隨機快速排序能夠比較高效地完成任務。
實際運行下來和歸并排序之間都有一些差距,猜測原因是隨機操作的耗時很大,并且 Leetcode 平臺上專門設置了卡快排的用例。

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

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

相關文章

unraid固態硬盤分區格式—默認1MiB對齊

背景 我的unraid中有三個機械硬盤和兩個固態硬盤&#xff0c;其中兩個固態硬盤組成zfs鏡像的cache&#xff0c;防止其中一個硬盤出問題導致數據丟失。然而&#xff0c;今天突然看到機械硬盤的分區格式為GPT 4k&#xff0c;而固態硬盤是MBR 1MiB。想到GPT更加優秀&#xff0c;并…

Flutter 圖片編輯板(一) 事件路由

一個圖片編輯板&#xff0c;有兩部分組成。編輯板和內容項。每一個內容項是被InteractiveViewer修飾的widget&#xff0c;具有縮放偏移的功能。 在圖片編輯板上&#xff0c; 會有多個內容相&#xff0c;圖片或文字&#xff08;添加文字目前還沒做過&#xff09;。 當要編輯其中…

數倉技術hive與oracle對比(一)

準備 包括軟硬件環境、數據、測試數據三方面的準備內容。 環境 虛擬機軟件virtualbox7&#xff0c;同樣的虛擬機配置&#xff1a;內存2G、cpu一核&#xff0c;物理主機同一臺macbookpro&#xff08;13-2020款&#xff09;&#xff0c;所以硬盤IO讀寫速度一致。 綜上&#x…

AR眼鏡_消費級工業AR智能眼鏡主板硬件解決方案

AR眼鏡的研發是一項復雜的軟硬件集成工程&#xff0c;它需要在攝影、音頻、交互和連接等多個方面提供卓越的基礎體驗&#xff0c;因此產品的每個細節都顯得尤為重要。 在設計AR眼鏡時&#xff0c;重量、體積和散熱性能都是必須認真考量的關鍵因素。在芯片平臺的選擇上&#xff…

通信原理概論復習筆記(1)

1 緒論 消息: 通信系統傳輸對象, 信息的載體和物理表現形式. 信息: 消息的有效內容和內涵. 信號: 消息的傳輸載體. 模擬通信: 信源 → \to → 調制器 → \to → 信道(噪聲) → \to → 解調器 → \to → 信宿. 數字通信: 信源 → \to → 信源編碼(壓縮數字化) → \to →…

ASPICE評估如何優化軟件開發、測試和部署流程

ASPICE&#xff08;Automotive SPICE&#xff0c;即汽車軟件過程改進及能力評定&#xff09;評估在提高軟件開發、測試、部署的速度和質量方面發揮著重要作用。以下是ASPICE評估如何具體提高這些環節的具體方式&#xff1a; 一、提高軟件開發效率 標準化流程&#xff1a;ASPIC…

【OpenCV】Canny邊緣檢測

理論 Canny 邊緣檢測是一種流行的邊緣檢測算法。它是由 John F. Canny 在 1986 年提出。 這是一個多階段算法&#xff0c;我們將介紹算法的每一個步驟。 降噪 由于邊緣檢測易受圖像中的噪聲影響&#xff0c;因此第一步是使用 5x5 高斯濾波器去除圖像中的噪聲。我們在前面的章…

Ubuntu 安裝 web 服務器

安裝 apach sudo apt install apache2 -y 查看 apach2 版本號 apache2 -v 檢查是否啟動服務器 sudo service apache2 status 檢查可用的 ufw 防火墻應用程序配置 sudo ufw app list 關閉防火墻 sudo ufw disable 更改允許通過端口流量 sudo ufw allow Apache Full 開啟…

如何落地文件即服務?--- 基于makeself封裝服務并啟動

我通常想能不能給客戶一個文件&#xff0c;然后客戶通過執行這個簡單的指令就可以吧&#xff0c;一個服務在本地起來&#xff1f; 這是一種文件即服務的思想&#xff0c;不知道你有沒有類似的想法&#xff0c;當我發現https://makeself.io/ &#xff0c;我覺得它能很好的解決我…

mysql集群MHA方式部署

1. 基本信息 部署機器角色部署路徑192.168.242.71MySQL-Mater MHA-NodeMySQL: /alidata1/mysql-5.7.43192.168.242.72MySQL-Slave MHA-NodeMHA-Node: /alidata1/admin/tools/mha4mysql-node-0.58192.168.242.73MySQL-Slave MHA-Node192.168.242.74MHA-ManagerMHA-Manager: …

【C++】8___繼承

目錄 一、基本語法 二、繼承方式 三、對象模型 四、繼承中的構造與析構的順序 五、繼承中同名成員處理 六、多繼承語法 七、菱形繼承 一、基本語法 好處&#xff1a;減少重復的代碼 語法&#xff1a; class 子類 &#xff1a; 繼承方式 父類 子類 也稱為 派生類 父類…

Netty客戶端接收不到服務端發送的數據問題

文章目錄 前言問題描述相關代碼解決方法 前言 環境 JDK&#xff1a;64位 jdk1.8.0_201 Netty&#xff1a;4.1.39.Final 問題描述 項目中使用Netty接受客戶端的消息&#xff0c;客戶端為硬件設備&#xff0c;在接受數據后發送數據到服務端。 同時因為客戶端沒有聯網&#xff…

IDEA方法注釋模板設置

目錄 創建模板 新建模板&#xff1a;命名為* 設置模板內容-IDEA格式模板 設置模板應用場景 設置參數 創建模板 /**Enter這里我們也按照這種習慣來設置IDEA的方法注釋&#xff1a;File-->Settings-->Editor-->Live Templates 先新建模板組&#xff0c;然后在模板組中…

vscode 配置C/C++環境控制臺參數

您可以通過以下步驟在VS Code中配置C/C環境的控制臺參數&#xff1a; 1&#xff0c;打開VS Code并進入您的C/C項目 2&#xff0c;點擊左側的"調試"圖標&#xff0c;然后點擊頂部的齒輪圖標&#xff0c;選擇“launch.json”。 3&#xff0c;在"launch.json&qu…

深度學習筆記之BERT(五)TinyBERT

深度學習筆記之TinyBERT 引言回顧&#xff1a;DistilBERT模型TinyBERT模型結構TinyBERT模型策略Transformer層蒸餾嵌入層蒸餾預測層蒸餾 TinyBERT模型的訓練效果展示 引言 上一節介紹了 DistilBERT \text{DistilBERT} DistilBERT模型&#xff0c;本節將繼續介紹優化性更強的知…

正則表達式——參考視頻B站《奇樂編程學院》

智能指針 一、背景&#x1f388;1.1. 模式匹配&#x1f388;1.2. 文本替換&#x1f388;1.3. 數據驗證&#x1f388;1.4. 信息提取&#x1f388;1.5. 拆分字符串&#x1f388;1.6. 高級搜索功能 二、原料2.1 參考視頻2.2 驗證網址 三、用法3.1 限定符3.1.1 ?3.1.2 *3.1.3 3.1.…

appium學習之二:adb命令

1、查看設備 adb devices 2、連接 adb connect IP:端口 3、安裝 adb install xxx.apk 4、卸載 adb uninstall 【包名】 5、把對應目錄下的1.txt文件傳到手機sdcard下 adb push 1.txt /sdcard 6、進入對應的設備里 adb shell 7、切入sdcard目錄 cd /sdcard 8、ls 查…

Tablesaw封裝Plot.ly實現數據可視化

上文介紹tablesaw的數據處理功能&#xff0c;本文向你展示其數據可視化功能&#xff0c;并通過幾個常用圖表示例進行說明。 Plot.ly包裝 可視化是數據分析的重要組成部分&#xff0c;無論你只是“查看”新數據集還是驗證機器學習算法的結果。Tablesaw是一個開源、高性能的Java…

Python實現中國象棋

探索中國象棋 Python 代碼實現&#xff1a;從規則邏輯到游戲呈現 中國象棋&#xff0c;這款源遠流長的棋類游戲&#xff0c;承載著深厚的文化底蘊與策略智慧。如今&#xff0c;借助 Python 與 Pygame 庫&#xff0c;我們能夠在數字世界中復刻其魅力&#xff0c;深入探究代碼背后…

互聯網、物聯網的相關標準

互聯網的相關標準 網絡通信協議&#xff1a; HTTP&#xff08;Hypertext Transfer Protocol&#xff09;&#xff1a;用于在網絡中傳輸文本、圖像、音頻和視頻等數據的協議。它基于請求-響應模型&#xff0c;客戶端發送請求給服務器&#xff0c;服務器返回響應。HTTPS&a…