Python實現快速排序的三種經典寫法及算法解析

今天想熟悉一下python的基礎寫法,那就從最經典的快速排序來開始吧:

1、經典分治寫法(原地排序)
時間復雜度:平均O(nlogn),最壞O(n2)
空間復雜度:O(logn)遞歸棧空間
特點:通過左右指針交換實現原地排序

def quick_sort(arr, low, high):
? ? if low < high:
? ? ? ? pi = partition(arr, low, high)
? ? ? ? quick_sort(arr, low, pi-1)
? ? ? ? quick_sort(arr, pi+1, high)

def partition(arr, low, high):
? ? pivot = arr[high]
? ? i = low - 1
? ? for j in range(low, high):
? ? ? ? if arr[j] <= pivot:
? ? ? ? ? ? i += 1
? ? ? ? ? ? arr[i], arr[j] = arr[j], arr[i]
? ? arr[i+1], arr[high] = arr[high], arr[i+1]
? ? return i + 1

2、Pythonic簡潔寫法(非原地)
特點:利用列表推導式,代碼更簡潔但需要額外空間

quick_sort(arr):
? ? if len(arr) <= 1:
? ? ? ? return arr
? ? pivot = arr[len(arr)//2]
? ? left = [x for x in arr if x < pivot]
? ? middle = [x for x in arr if x == pivot]
? ? right = [x for x in arr if x > pivot]
? ? return quick_sort(left) + middle + quick_sort(right)

?

3、尾遞歸優化寫法
特點:減少遞歸深度,避免棧溢出風險

quick_sort(arr, low=0, high=None):
? ? if high is None:
? ? ? ? high = len(arr) - 1
? ? while low < high:
? ? ? ? pi = partition(arr, low, high)
? ? ? ? if pi - low < high - pi:
? ? ? ? ? ? quick_sort(arr, low, pi-1)
? ? ? ? ? ? low = pi + 1
? ? ? ? else:
? ? ? ? ? ? quick_sort(arr, pi+1, high)
? ? ? ? ? ? high = pi - 1
? ? return arr

算法核心思想:分治法+基準值選取。第一種實現最接近傳統快速排序定義,第二種適合教學演示,第三種適合處理大數據集。實際使用時建議添加隨機化基準值選擇來避免最壞情況。

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

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

相關文章

海康網絡攝像頭實時取幀轉Opencv數組格式(h,w,3),已實現python、C#

海康攝像頭取幀都是有官方demo的&#xff0c;但是將海康格式的數據轉為Opencv格式的沒有相關demo&#xff0c;而大部分深度學習圖像檢測算法(如YOLO)&#xff0c;都是用opencv格式的圖像作為輸入&#xff0c;因此將海康格式數據轉為opencv格式兼容性更強 需要代碼請私信聯系&a…

職坐標IT教育物聯網全棧開發實戰:傳感器到云平臺全鏈路

物聯網全棧開發涉及從終端感知到云端服務的全流程技術整合&#xff0c;其核心在于構建完整的“端-管-云-用”技術鏈條。為幫助開發者系統掌握這一能力&#xff0c;課程圍繞四大模塊展開&#xff1a;傳感器數據采集與處理、通信協議適配與優化、云平臺架構設計及跨平臺應用開發。…

LUFFY(路飛): 使用DeepSeek指導Qwen強化學習

論文標題 Learning to Reason under Off-Policy Guidance 論文地址 https://arxiv.org/pdf/2504.14945 代碼地址 https://github.com/ElliottYan/LUFFY 作者背景 上海人工智能實驗室&#xff0c;西湖大學&#xff0c;南京大學&#xff0c;香港中文大學 動機 目前大模型…

Android Camera Hal中通過Neon指令優化數據拷貝

背景描述&#xff1a; Camera apk普通相機模式錄像操作時&#xff0c;一般是同時請求兩個流&#xff0c;即預覽流和錄像流。對于兩個流輸出圖像格式和分辨率相同的情況下&#xff0c;是不是可以通過一個流拷貝得到另一個流的數據&#xff0c;進而節省掉一個Sensor輸出處理兩次…

WPS word 已有多級列表序號

wps的word中&#xff0c;原來已生成的文檔里&#xff0c;已存在序號。比如&#xff0c;存在2、2.1、2.1.1、2.1.1.1、2.1.1.1.1 5層序號&#xff0c;而且已分為5級。但增加內容的時候&#xff0c;并不會自動增加序號&#xff0c;應該如何解決&#xff1f; 原來長這樣&#xff…

從零開始制作小程序簡單概述

以下是結合案例的“從零制作小紅書風格小程序”的全流程指南&#xff0c;采用小紅書爆款筆記的結構呈現&#xff0c;并附CSDN參考資源&#x1f447;&#xff1a; 一、核心開發步驟&#xff08;附工具推薦&#xff09; 賬號與定位 ? 注冊類型選擇&#xff1a;個人店&#xff08…

【Go語言基礎【13】】函數、閉包、方法

文章目錄 零、概述一、函數基礎1、函數基礎概念2、參數傳遞機制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 錯誤處理 二、函數類型與高階函數1. 函數類型定義2. 高階函數&#xff08;函數作為參數、返回值&#xff09; 三、匿名函數與閉包1. 匿名函數&#xff08;Lambda函…

網絡編程之服務器模型與UDP編程

一、服務器模型 在網絡通信中&#xff0c;通常要求一個服務器連接多個客戶端 為了處理多個客戶端的請求&#xff0c;通常有多種表現形式 1、循環服務器模型 一個服務器可以連接多個客戶端&#xff0c;但同一時間只能連接并處理一個客戶的請求 socket() 結構體 bind() listen() …

open3D:三維點云處理

open3d 點云數據處理 爆肝5萬字??Open3D 點云數據處理基礎&#xff08;Python版&#xff09;_python 點云 焊縫-CSDN博客 如何用NumPy讀取和保存點云數據 - 知乎 讀取并可視化點云 np.loadtxt 從txt中讀取點集&#xff0c;并open3d顯示單個點云 txt內容&#xff1a;每行皆…

使用聯邦多軌跡圖神經網絡(GNNs)結合稀缺數據預測嬰兒腦連接|文獻速遞-深度學習醫療AI最新文獻

Title 題目 Predicting infant brain connectivity with federated multi-trajectory GNNs using scarce data 使用聯邦多軌跡圖神經網絡&#xff08;GNNs&#xff09;結合稀缺數據預測嬰兒腦連接 01 文獻速遞介紹 多模態影像下的嬰兒腦連接演化預測&#xff1a;聯邦學習與…

[特殊字符] 深入理解 Linux 內核進程管理:架構、核心函數與調度機制

Linux 內核作為一個多任務操作系統&#xff0c;其進程管理子系統是核心組成部分之一。無論是用戶應用的運行、驅動行為的觸發&#xff0c;還是系統調度決策&#xff0c;幾乎所有操作都離不開進程的創建、調度與銷毀。本文將從進程的概念出發&#xff0c;深入探討 Linux 內核中進…

第16節 Node.js 文件系統

Node.js 提供一組類似 UNIX&#xff08;POSIX&#xff09;標準的文件操作API。 Node 導入文件系統模塊(fs)語法如下所示&#xff1a; var fs require("fs") 異步和同步 Node.js 文件系統&#xff08;fs 模塊&#xff09;模塊中的方法均有異步和同步版本&#xff…

《探秘局域網廣播:網絡世界的 “大喇叭”》

揭開局域網廣播的神秘面紗 在當今數字化時代,網絡已成為人們生活和工作中不可或缺的一部分。從日常的網頁瀏覽、社交媒體互動,到企業級的數據傳輸、云計算應用,網絡通信無處不在。在這個龐大而復雜的網絡世界里,數據如同信息流在各個節點之間穿梭,而局域網廣播則是其中一種…

基于Ubuntu22.04安裝SVN服務器之倉庫遷移

基于Ubuntu22.04安裝SVN服務器之倉庫遷移 第一步: 停止svn服務器 第一步: 停止svn服務器 1&#xff09;建議遷移的時候先把SN服務器停掉&#xff0c;以免操作失敗。 svnserve -d -r /usr/svn第二步&#xff1a;dump出svn代碼庫 1&#xff09;通過dump出舊的svn服務器上的代碼…

Unity UI 性能優化終極指南 — Image篇

&#x1f3af; Unity UI 性能優化終極指南 — Image篇 &#x1f9e9; Image 是什么&#xff1f; Image 是UGUI中最常用的基本繪制組件支持顯示 Sprite&#xff0c;可以用于背景、按鈕圖標、裝飾等是UI性能瓶頸的頭號來源之一&#xff0c;直接影響Draw Call和Overdraw &#x1…

「Java基本語法」代碼格式與注釋規范

Java代碼的基本格式 Java代碼的規范格式是編寫和維護Java程序的基礎&#xff0c;其中包括類定義、方法定義、代碼縮進、大括號位置等。 1&#xff0e;核心規則 每個Java文件必須包含一個公共類&#xff08;public class&#xff09;&#xff0c;且Java源文件的文件名必須和這…

2025年AI編程工具推薦

目錄 &#x1f451; **一、全能型AI開發環境&#xff08;IDE&#xff09;**&#x1f6e0;? **二、AI代碼助手與插件**&#x1f3af; **三、垂直領域工具**&#x1f1e8;&#x1f1f3; **四、國產工具精選**&#x1f52e; **五、創新前沿工具**?? **選型建議** 2025年&#x…

【工具使用】STM32CubeMX-FreeRTOS操作系統-信號標志、互斥鎖、信號量篇

一、概述 無論是新手還是大佬&#xff0c;基于STM32單片機的開發&#xff0c;使用STM32CubeMX都是可以極大提升開發效率的&#xff0c;并且其界面化的開發&#xff0c;也大大降低了新手對STM32單片機的開發門檻。 ????本文主要講述STM32芯片FreeRTOS信號標志、互斥鎖和信號…

ArrayList和LinkedList(深入源碼加擴展)

ArrayList 和 LinkedList 是 Java 集合框架中兩種常用的列表實現,它們在底層數據結構、性能特點和適用場景上有顯著的區別。以下是它們的詳細對比以及 ArrayList 的擴容機制。 1. ArrayList 和 LinkedList 的底層區別 (1) 底層數據結構 ArrayList: 基于動態數組(Dynamic Ar…

淺談 React Suspense

React Suspense 是 React 中用于處理異步操作的功能。它可以讓你"等待"某些操作&#xff0c;如數據獲取或組件加載完成&#xff0c;然后再渲染組件。Suspense 的核心理念是讓組件在準備好之前顯示一個備用的 UI&#xff0c;例如加載指示器&#xff0c;從而提高用戶體…