【基礎3】快速排序

核心思路

快速排序是Java中Arrays.sort()的實現原理,采用分治策略,通過選擇基準元素,將數組分為兩個子數組,使得左邊元素 ≤ 基準元素 ≤ 右邊元素,然后遞歸排序子數組。

舉個簡單的例子,圖書管理員需要按照書本厚度對一箱書進行排序,使用快速排序就是先選擇一本書作為中間基準,把厚的書放在它右邊,薄的書放在它左邊。(這里左右兩邊內部是無序的)

處理完后再對它左邊的書分別快速排序(即選出新的基準元素,厚的放右邊,薄的放左邊),同理右邊也是一樣,最后就得到完整的序列。

復雜度
情況時間復雜度空間復雜度
?最好情況?O(n logn)O(logn)
?最壞情況?O(n2)O(n)
?平均情況?O(n logn)O(logn)
優缺點

優點

  1. 平均情況下最快的比較排序算法
  2. 原地排序(不需要額外內存)
  3. 高度可優化

缺點

  1. 最壞情況時間復雜度較高
  2. 不穩定排序
  3. 遞歸實現需要棧空間

適用場景

  • 大規模數據排序
  • 需要高效率的通用排序
  • 內存受限環境
代碼實現(Java)
public class QuickSort {public static void main(String[] args) {int[] arr = {5, 3, 8, 4, 2};quickSort(arr, 0, arr.length - 1);System.out.println(Arrays.toString(arr)); }public static void quickSort(int[] arr, int low, int high) {if (low < high) {//選出基準元素int pivotIndex = partition(arr, low, high);//排序左半部quickSort(arr, low, pivotIndex - 1);  //排序右半部quickSort(arr, pivotIndex + 1, high); }}/*** 分區(這里以最后一個元素為基準)*/private static int partition(int[] arr, int low, int high) {//基準元素int pivot = arr[high]; //小元素區間的左邊界int i = low - 1;       //i+1實際上就是最后基準元素要被移到的位置for (int j = low; j < high; j++) {//把小于基準的元素不斷向左靠攏(比基準大的元素也被動地向右邊移動),//最后[low,i]的元素都比基準小,那么i+1的位置自然就留給基準元素了if (arr[j] <= pivot) {i++;swap(arr, i, j);}}//移動基準元素swap(arr, i + 1, high); return i + 1;}private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}
排序過程

初始數組:[5, 3, 8, 4, 2]

第1次分區(pivot=2)

移動元素:5>2,3>2,8>2,4>2 → 無交換  
最終交換基準 → [2, 3, 8, 4, 5]
返回位置0

遞歸左半部(空數組)和右半部[3,8,4,5]

第2次分區(pivot=5)

排序數組:[3,8,4,5]  
移動元素:3<5,8>5,4<5 → 交換8和4  
最終數組:[3,4,5,8]  
返回位置2

遞歸處理左右子數組

左半部[3,4] → 最終排序[3,4]  
右半部[8] → 保持原樣

最終結果

[2, 3, 4, 5, 8]

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

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

相關文章

FreeSWITCH 簡單圖形化界面40 - 使用mod_curl模塊進行http請求

FreeSWITCH 簡單圖形化界面40 - 使用mod_curl模塊進行http請求 0、界面預覽00、簡介1、編譯安裝1.1 編輯模塊配置文件 2、使用2.1 撥號規則GET 請求POST 請求JSON 數據 2.2 Lua 腳本GET 請求POST 請求JSON 數據 3 、示例3.1 示例 1&#xff1a;提交 CDR 到第三方接口3.2 示例 2…

Linux 開發工具

linux中&#xff0c;常見的軟件安裝方式---下載 yum/apt.rpm安裝包安裝源碼安裝 yum 查看軟件包 通過yumlist命令可以羅列出當前?共有哪些軟件包.由于包的數?可能?常之多,這?我們需要使? grep 命令只篩選出我們關注的包.例如: # Centos $ yum list | grep lrzsz lr…

Agent革命:Manus如何用工作流拆解掀起AI生產力革命

一、現象級產品的誕生背景 2025年3月6日&#xff0c;一款名為Manus的AI產品在技術圈引發地震式傳播。其官方測試數據顯示&#xff1a;在GAIA基準測試中&#xff0c;基礎任務準確率達86.5%&#xff08;接近人類水平&#xff09;&#xff0c;中高級任務完成率突破57%。這標志著A…

Linux13-TCP\HTTP

一、TCP粘包問題 1.TCP在接受數據時,多包數據粘在一起 2.原因: 2.1TCP發送數據時,會根據緩沖區數據的情況進行重新組包 2.2TCP接收方,沒有及時讀走緩沖區數據,導致緩沖區大量數據緩存。 3.如何解決 3.1發指定大小字節 將要發數據,封裝在結構體里 struct data { …

網絡安全等級保護2.0 vs GDPR vs NIST 2.0:全方位對比解析

在網絡安全日益重要的今天&#xff0c;各國紛紛出臺相關政策法規&#xff0c;以加強信息安全保護。本文將對比我國網絡安全等級保護2.0、歐盟的GDPR以及美國的NIST 2.0&#xff0c;分析它們各自的特點及差異。 網絡安全等級保護2.0 網絡安全等級保護2.0是我國信息安全領域的一…

oracle通過dmp導入數據

1、創建用戶&#xff0c;并賦予sysdba權限 登錄sysdba用戶 sqlplus / as sysdba 賦予sysdba權限 grant sysdba to your_user; 2、導入dmp文件 imp target_user/passwordip:port/SERVER_NAME fromusersource_user tousertarget_user fileyour.dmp logdmp_file.log statist…

MySQL 面試篇

MySQL相關面試題 定位慢查詢 **面試官&#xff1a;**MySQL中&#xff0c;如何定位慢查詢? 我們當時做壓測的時候有的接口非常的慢&#xff0c;接口的響應時間超過了2秒以上&#xff0c;因為我們當時的系統部署了運維的監控系統Skywalking &#xff0c;在展示的報表中可以看到…

MyBatis 操作數據庫

目錄 1、MyBatis 是什么2、配置 MyBatis 開發環境2.1、添加 MyBatis 框架支持2.1.1、老項目添加 MyBatis2.1.2、新項目添加 MyBatis 2.2、配置數據庫連接字符串2.3、配置 MyBatis 中的 XML 路徑 3、添加業務代碼3.1、添加實體類3.2、添加 mapper 接口3.3、添加 xml 文件3.4、添…

uniapp使用藍牙,usb,局域網,打印機打印

使用流程&#xff08;支持安卓和iOS&#xff09; 引入SDK 引入原生插件包地址如下 https://github.com/oldfive20250214/UniPrinterDemo 連接設備 安卓支持經典藍牙、ble藍牙、usb、局域網&#xff08;參考API&#xff09; iOS支持ble藍牙、局域網&#xff08;參考API&…

Jmeter進行http接口測試詳解

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 本文主要針對http接口進行測試&#xff0c;使用 jmeter工具實現。 Jmeter工具設計之初是用于做性能測試的&#xff0c;它在實現對各種接口的調用方面已經做的比較…

力扣35.搜索插入位置-二分查找

class Solution:def searchInsert(self, nums: List[int], target: int) -> int:# 初始化左右指針left, right 0, len(nums) - 1# 當左指針小于等于右指針時&#xff0c;繼續循環while left < right:# 計算中間位置mid (left right) // 2# 如果中間元素等于目標值&…

為AI聊天工具添加一個知識系統 之133 詳細設計之74通用編程語言 之4 架構及其核心

本篇繼續討論 通用編程語言。 說明&#xff1a;本階段的所有討論都是圍繞這一主題展開的&#xff0c;但前面的討論分成了三個大部分&#xff08;后面列出了這一段的討論題目的歸屬關系&#xff09;-區別distinguish&#xff08;各別&#xff09;&#xff1a; 文化和習俗。知識…

PPT 技能:巧用 “節” 功能,讓演示文稿更有序

在制作PPT時&#xff0c;你是否遇到過這樣的情況&#xff1a;幻燈片越來越多&#xff0c;內容越來越雜&#xff0c;找某一頁內容時翻得眼花繚亂&#xff1f;尤其是在處理大型PPT文件時&#xff0c;如果沒有合理的結構&#xff0c;編輯和調整都會變得非常麻煩。這時候&#xff0…

劉火良 FreeRTOS內核實現與應用之1——列表學習

重要數據 節點的命名都以_ITEM后綴進行&#xff0c;鏈表取消了后綴&#xff0c;直接LIST 普通的節點數據類型 /* 節點結構體定義 */ struct xLIST_ITEM { TickType_t xItemValue; /* 輔助值&#xff0c;用于幫助節點做順序排列 */ struct xLIST_I…

Uniapp項目運行到微信小程序、H5、APP等多個平臺教程

摘要&#xff1a;Uniapp作為一款基于Vue.js的跨平臺開發框架&#xff0c;支持“一次開發&#xff0c;多端部署”。本文將手把手教你如何將Uniapp項目運行到微信小程序、H5、APP等多個平臺&#xff0c;并解析常見問題。 一、環境準備 在開始前&#xff0c;請確保已安裝以下工具…

100天精通Python(爬蟲篇)——第115天:爬蟲在線小工具_Curl轉python爬蟲代碼工具(快速構建初始爬蟲代碼)

文章目錄 一、curl是什么&#xff1f;二、爬蟲在線小工具&#xff08;牛逼puls&#xff09;三、實戰操作 一、curl是什么&#xff1f; 基本概念&#xff1a;curl 支持多種協議&#xff0c;如 HTTP、HTTPS、FTP、SFTP 等&#xff0c;可用于從服務器獲取數據或向服務器發送數據&a…

[內網安全] Windows 域認證 — Kerberos 協議認證

&#x1f31f;想系統化學習內網滲透&#xff1f;看看這個&#xff1a;[內網安全] 內網滲透 - 學習手冊-CSDN博客 0x01&#xff1a;Kerberos 協議簡介 Kerberos 是一種網絡認證協議&#xff0c;其設計目標是通過密鑰系統為客戶機 / 服務器應用程序提供強大的認證服務。該認證過…

PyTorch中的損失函數:F.nll_loss 與 nn.CrossEntropyLoss

文章目錄 背景介紹F.nll_loss什么是負對數似然損失&#xff1f;應用場景 nn.CrossEntropyLoss簡化工作流程內部機制 區別與聯系 背景介紹 無論是圖像分類、文本分類還是其他類型的分類任務&#xff0c;交叉熵損失&#xff08;Cross Entropy Loss&#xff09;都是最常用的一種損…

案例1_3:流水燈

文章目錄 文章介紹原理圖&#xff08;同案例1_2&#xff09;代碼效果圖 文章介紹 原理圖&#xff08;同案例1_2&#xff09; 代碼 #include <reg51.h> // 包含頭文件void delay(unsigned int time) {unsigned int i, j;for (i 0; i < time; i)for (j 0; j < 1…

基于物聯網技術的電動車防盜系統設計(論文+源碼)

1總體設計 本課題為基于物聯網技術的電動車防盜系統&#xff0c;在此將整個系統架構設計如圖2.1所示&#xff0c;其采用STM32F103單片機為控制器&#xff0c;通過NEO-6M實現GPS定位功能&#xff0c;通過紅外傳感器檢測電瓶是否離開位&#xff0c;通過Air202 NBIOT模塊將當前的數…