快速排序算法Python實現

快速排序原理和步驟

快速排序是一種高效的排序算法,基于分治法(Divide and Conquer)來實現。其基本思想是通過一次排序將數組分成兩部分,其中一部分的所有元素都小于另一部分,然后遞歸地對這兩部分進行排序。以下是快速排序的詳細步驟:

1. 選擇基準元素

首先,從數組中選擇一個基準元素(pivot)。基準元素的選擇方法有多種,例如選擇第一個元素、最后一個元素、中間元素或隨機選擇一個元素。基準元素用于將數組分成兩部分。

2. 分區

通過遍歷數組,將所有小于基準元素的元素放到基準元素的左邊,所有大于基準元素的元素放到基準元素的右邊。這個過程稱為分區(partitioning)。分區后,基準元素的位置是其在最終排序數組中的正確位置。

3. 遞歸排序

對基準元素左邊的子數組和右邊的子數組分別遞歸地應用快速排序。這個過程將不斷分割和排序子數組,直到所有子數組的長度為1,表示數組已經有序。

4. 合并

由于快速排序是原地排序(in-place sorting),不需要額外的合并步驟。遞歸過程結束后,整個數組已經有序。

快速排序的完整步驟

  1. 選擇基準: 選擇一個基準元素。
  2. 分區: 將數組分成兩部分,一部分小于基準元素,另一部分大于基準元素。
  3. 遞歸排序: 遞歸地對基準元素左邊和右邊的子數組進行排序。
  4. 完成: 遞歸結束后,數組有序。

快速排序的偽代碼

void quickSort(vector<int>& arr, int low, int high) {if (low < high) {// 獲取分區點int pi = partition(arr, low, high);// 對分區點左邊的子數組進行遞歸排序quickSort(arr, low, pi - 1);// 對分區點右邊的子數組進行遞歸排序quickSort(arr, pi + 1, high);}
}int partition(vector<int>& arr, int low, int high) {// 選擇最后一個元素作為基準int pivot = arr[high];int i = (low - 1);for (int j = low; j <= high - 1; j++) {// 如果當前元素小于或等于基準if (arr[j] <= pivot) {i++;// 交換 arr[i] 和 arr[j]swap(arr[i], arr[j]);}}// 交換 arr[i + 1] 和 arr[high] (或基準)swap(arr[i + 1], arr[high]);return (i + 1);
}

Python實現:

def quick_sort(arr):"""對數組進行快速排序:param arr: 待排序的數組:return: 已排序的數組"""# 如果數組的長度為0或1,直接返回數組if len(arr) <= 1:return arr# 選擇數組的最后一個元素作為基準pivot = arr[-1]# 定義兩個空列表,分別存放小于和大于基準的元素left = []right = []# 遍歷數組(不包括最后一個元素,即基準)for element in arr[:-1]:if element < pivot:left.append(element)else:right.append(element)# 遞歸地對左右兩個子數組進行快速排序,并合并return quick_sort(left) + [pivot] + quick_sort(right)

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

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

相關文章

前端構建工具(webpackvite)

這里寫目錄標題 構建工具webpack介紹配置文件簡介entryoutputloaderbabel插件開發服務器&#xff08;webpack-dev-server&#xff09;soureMap vite 構建工具 當我們習慣了在node中編寫代碼的方式后&#xff0c;在回到前端編寫html、css、js這些東西會感覺到各種的不便。比如:…

夏季戶外綜合征怎么預防

以下是一些預防夏季戶外綜合征的有效方法&#xff1a; 做好防曬措施&#xff1a; 涂抹高倍數的防曬霜&#xff0c;每隔 2 - 3 小時重新涂抹一次。比如選擇 SPF50、PA 的防曬霜。佩戴寬邊帽子、太陽鏡和遮陽傘&#xff0c;減少陽光直射面部和眼睛。像漁夫帽、大檐帽能有效遮擋陽…

12-阿里云單細胞處理-PBMC(by-jmzeng)

scRNA_10X/seurat-v2/sup-patient1-PBMC.Rmd at master jmzeng1314/scRNA_10X (github.com) s04-運行seurat流程處理一萬個單細胞轉錄組數據并自動化出報告_嗶哩嗶哩_bilibili #section 3已更新#「生信技能樹」單細胞公開課2021_嗶哩嗶哩_bilibili 上傳讀取數據 可以配置租…

模擬型題目

題目類型&#xff1a; 給定操作&#xff0c;允許操作任意次 思路收集&#xff1a; 1.暴力遍歷&#xff1a;如Problem - B - Codeforces 直接讓每一個不同的進行操作 2.歸納&#xff1a;根據模擬來發現規律

RTK_ROS_導航(4):ROS中空地圖的生成與加載

1. 地圖加載 構建空白 Map 如下,以下為python代碼,生成了output_image.pgm 文件 一般你在什么地方運行該代碼,這個文件就生成在什么地方 import numpy as np size = 100 # 單位:m resulition = 0.05 # 單位:mw = round(size / resulition) IMAGE_DATA = np.zeros((w

ChatGPT:Swagger 的疑問

ChatGPT&#xff1a;Swagger 的疑問 這段代碼是做什么的&#xff0c;為什么每個微服務的寫法都一樣 springdoc:api-docs:enabled: true # 1. 是否開啟 Swagger 接文檔的元數據path: /v3/api-docsswagger-ui:enabled: true # 2.1 是否開啟 Swagger 文檔的官方 UI 界面path: /sw…

音視頻解封裝demo:使用libmp4v2解封裝(demux)出mp4文件中的h264視頻數據和aac語音數據

1、README 前言 本demo是使用的mp4v2來將mp4文件解封裝得到h264、aac的&#xff0c;目前demo提供的.a靜態庫文件是在x86_64架構的Ubuntu16.04編譯得到的&#xff0c;如果想在其他環境下測試demo&#xff0c;可以自行編譯mp4v2并替換相應的庫文件&#xff08;libmp4v2.a&#…

HTTP 范圍Range請求

HTTP 的 Range 請求使客戶端能夠要求服務器僅向其回傳 HTTP 消息的一部分 HTTP 的 Range 請求頭是 HTTP/1.1 協議的一個特性。它允許客戶端請求僅傳輸資源的某個特定部分&#xff0c;而不是整個資源。 適用場景 支持隨機訪問的媒體播放器明確只需大型文件某部分的數據處理工具…

2022 RoboCom 世界機器人開發者大賽-高職組(國賽):智能管家

人上了年紀&#xff0c;記性就會變差&#xff0c;時常不得不翻箱倒柜找東西。智能照護中心現在請你做一個簡單的智能管家程序&#xff0c;把老人家里的東西逐一編號&#xff0c;放進若干個收納箱里。當然收納箱也是有編號的&#xff0c;你的程序要記錄下哪個東西放在哪個收納箱…

R包: phyloseq擴增子統計分析利器

介紹 phyloseq包對多類型數據的綜合軟件&#xff0c;并其對這些數據提供統計分析和可視化方法。 微生物數據分析的主要挑戰之一是如何整合不同類型的數據&#xff0c;從而對其進行生態學、遺傳學、系統發育學、多元統計、可視化和檢驗等分析。同時&#xff0c;由于同行之間需要…

QT學習日記一

創建QT文件步驟 這是創建之后widget.cpp和widget.h文件的具體代碼解釋&#xff0c;也是主要操作的文件&#xff0c;其中main.cpp不用操作&#xff0c;ui則是圖形化操作界面&#xff0c;綜合使用時&#xff0c;添加一個元件要注意重編名和編譯一下&#xff0c;才能在widget這類…

生產者消費者模型和線程同步問題

文章目錄 線程同步概念生產者消費者模型條件變量使用條件變量喚醒條件變量 阻塞隊列 線程同步概念 互斥能保證安全,但是僅有安全不夠,同步可以更高效的使用資源 生產者消費者模型 下面就基于生產者消費者來深入線程同步等概念: 如何理解生產消費者模型: 以函數調用為例: 兩…

[高頻 SQL 50 題(基礎版)]第一千七百五十七題,可回收且低脂產品

題目&#xff1a; 表&#xff1a;Products ---------------------- | Column Name | Type | ---------------------- | product_id | int | | low_fats | enum | | recyclable | enum | ---------------------- product_id 是該表的主鍵&#xff08;具有唯…

SQLite 命令行客戶端 + HTA 實現簡易UI

SQLite 命令行客戶端 HTA 實現簡易UI SQLite 客戶端.hta目錄結構參考資料 僅用于探索可行性&#xff0c;就只實現了 SELECT。 SQLite 客戶端.hta <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; cha…

C語言 | Leetcode C語言題解之第226題翻轉二叉樹

題目&#xff1a; 題解&#xff1a; struct TreeNode* invertTree(struct TreeNode* root) {if (root NULL) {return NULL;}struct TreeNode* left invertTree(root->left);struct TreeNode* right invertTree(root->right);root->left right;root->right le…

LeetCode加油站(貪心算法/暴力,分析其時間和空間復雜度)

題目描述 一.原本暴力算法 最初的想法是&#xff1a;先比較gas數組和cost數組的大小&#xff0c;找到可以作為起始點的站點(因為如果你起始點的油還不能到達下一個站點&#xff0c;就不能作為起始點)。當找到過后&#xff0c;再去依次順序跑一圈&#xff0c;如果剩余的油為負數…

從數據倉庫到數據湖(下):熱門的數據湖開源框架

文章目錄 一、前言二、Delta Lake三、Apache Hudi四、Apache Iceberg五、Apache Paimon六、對比七、筆者觀點八、總結八、參考資料 一、前言 在上一篇從數據倉庫到數據湖(上)&#xff1a;數據湖導論文章中&#xff0c;我們簡單講述了數據湖的起源、使用原因及其本質。本篇文章…

Rust入門實戰 編寫Minecraft啟動器#4下載資源

首發于Enaium的個人博客 首先我們需要添加幾個依賴。 model { path "../model" } parse { path "../parse" } reqwest { version "0.12", features ["blocking", "json"] } file-hashing { version "0.1&quo…

Xshell 和寶塔有啥區別

Xshell 和寶塔是兩種不同類型的工具&#xff0c;具有以下顯著區別&#xff1a; 1. 功能和用途 Xshell&#xff1a;主要是一款用于遠程連接服務器的終端模擬軟件。它允許用戶通過 SSH 協議安全地連接到遠程服務器&#xff0c;并在終端中執行命令&#xff0c;進行服務器的管理和…

AI論文作圖——如何表示模型參數凍結狀態

一、LOGO &#x1f525; win10win11 ?? win10win11 二、注意事項&#xff1a; 根據電腦系統&#xff0c;選擇對應的版本。 參考&#xff1a; 【AI論文作圖】如何表示模型參數凍結狀態&#xff1f;