java 排序算法-快速排序

快速排序(Quick Sort)是一種高效的排序算法,它使用分治法(Divide and Conquer)策略來把一個序列分為較小和較大的兩個子序列,然后遞歸地排序兩個子序列。

快速排序算法的基本思想:

  1. 選擇基準值(Pivot):從數列中挑出一個元素,稱為“基準”(pivot)。

  2. 分區操作:重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺放在基準的后面(相同的數可以到任一邊)。在這個分區退出之后,該基準就處于數列的中間位置。這個稱為分區(partition)操作。

  3. 遞歸排序子序列:遞歸地將小于基準值元素的子序列和大于基準值元素的子序列排序。

快速排序的步驟:?

  1. 選擇基準:可以選擇第一個元素、最后一個元素、中間元素或者隨機元素作為基準。

  2. 分區:設置兩個指針,一個從左向右掃描(稱為i),一個從右向左掃描(稱為j)。左指針i向右移動直到找到一個比基準大的元素,右指針j向左移動直到找到一個比基準小的元素。如果i?<?j,交換這兩個元素。重復這個過程直到i?>=?j

  3. 交換基準:將基準值放到最終位置(即ij相遇的位置)。

  4. 遞歸排序:遞歸地對基準值左右兩側的子序列進行快速排序。

Java實現快速排序的示例代碼:?

public class QuickSort {public static void quickSort(int[] arr, int low, int high) {if (low < high) {// pi是分區操作后基準值的正確位置int pi = partition(arr, low, high);// 分別對左右兩半部分進行快速排序quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}}private static int partition(int[] arr, int low, int high) {int pivot = arr[high];  // 選擇最后一個元素作為基準int i = (low - 1); // 小于區的邊界for (int j = low; j < high; j++) {// 如果當前元素小于或等于pivotif (arr[j] <= pivot) {i++;// 交換arr[i]和arr[j]int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 將pivot放到中間位置int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return i + 1; // 返回pivot的正確位置}public static void main(String args[]) {int[] arr = {10, 7, 8, 9, 1, 5};quickSort(arr, 0, arr.length - 1);System.out.println("Sorted array: ");for (int num : arr) {System.out.print(num + " ");}}
}

復雜度分析:?

  • 時間復雜度:平均情況下為O(n log n),最壞情況下為O(n^2)(例如,當輸入數組已經有序或接近有序時)。可以通過隨機選擇pivot或使用“三數取中法”等方法來優化性能。

  • 空間復雜度:由于快速排序是遞歸實現的,其空間復雜度在最壞情況下為O(n)(遞歸棧的深度)。可以通過非遞歸方式(迭代方式)實現來降低空間復雜度。?

通過上述步驟和示例代碼,你可以在Java中實現快速排序算法。?

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

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

相關文章

Linux工具學習之【vim】

&#x1f4d6;vim 基本用法 要想學會 vim 先要學會進入與退出它 &#x1f4c3;進入 vim 首先要保證自己的 Linux 中已經安裝好了 vim &#xff08;云服務器大多數都是出廠就安裝好了&#xff09;&#xff0c;如果沒有安裝&#xff0c;需要在 root 用戶下通過指令 yum instal…

win11系統截圖的幾種方式

在 Windows 11 中&#xff0c;系統內置的截圖功能已全面升級&#xff0c;不僅支持多種截圖模式&#xff0c;還整合了錄屏、OCR 文字識別和 AI 增強編輯等功能。以下是從基礎操作到高階技巧的完整指南&#xff1a; 一、快捷鍵截圖&#xff08;效率首選&#xff09; 1. Win Sh…

寫論文時降AIGC和降重的一些注意事項

‘ 寫一些研究成果&#xff0c;英文不是很好&#xff0c;用有道翻譯過來句子很簡單&#xff0c;句型很單一。那么你會考慮用ai嗎&#xff1f; 如果語句太正式&#xff0c;高級&#xff0c;會被誤判成aigc &#xff0c;慎重選擇ai潤色。 有的話就算沒有用ai生成&#xff0c;但…

Java學習手冊:Java并發編程最佳實踐

在Java并發編程中&#xff0c;遵循最佳實踐可以顯著提高程序的性能、可靠性和可維護性。本文將總結Java并發編程中的關鍵最佳實踐&#xff0c;幫助開發者避免常見陷阱并編寫高效的并發程序。 1. 選擇合適的并發工具 Java提供了豐富的并發工具&#xff0c;選擇合適的工具可以簡…

天梯賽DFS合集

1.DFS特殊輸入&#xff1a;PTA | 程序設計類實驗輔助教學平臺 這題其他還是蠻容易&#xff0c;直接用遞歸即可&#xff0c;問題在于怎么輸入&#xff0c;其實可以在遞歸到底層時輸入即可&#xff0c;也就是邊遞歸邊輸入&#xff0c;另外提一嘴跟這個題沒什么關系的點&#xff…

使用Pydantic優雅處理幾何數據結構 - 前端輸入驗證實踐

使用Pydantic優雅處理幾何數據結構 - 前端輸入驗證實踐 一、應用場景解析 在視頻分析類項目中&#xff0c;前端常需要傳遞幾何坐標數據。例如智能安防系統中&#xff0c;需要接收&#xff1a; 視頻流地址&#xff08;rtsp_video&#xff09;檢測區域坐標點&#xff08;point…

智譜AI大模型免費開放:開啟AI創作新時代

文章摘要&#xff1a;近日&#xff0c;國內領先的人工智能公司智譜AI宣布旗下多款大模型服務免費開放&#xff0c;這一舉措標志著大模型技術正式邁入普惠階段。本文將詳細介紹智譜AI此次開放的GLM-4 等大模型&#xff0c;涵蓋其主要功能、技術特點、使用步驟以及應用場景&#…

JMeter中設置HTTPS請求

在JMeter中設置HTTPS請求&#xff0c;你可以按照以下步驟進行操作&#xff1a; 步驟一&#xff1a;添加線程組 打開JMeter后&#xff0c;右鍵點擊“測試計劃”&#xff0c;選擇“添加” -> “線程&#xff08;用戶&#xff09;” -> “線程組”。線程組用于定義虛擬用戶…

線程池七個參數的含義

Java中的線程池里七個參數的以及其各自的含義 面試題&#xff1a;說一下線程池七個參數的含義&#xff1f; 所謂的線程池的 7 大參數是指&#xff0c;在使用 ThreadPoolExecutor 創建線程池時所設置的 7 個參數&#xff0c;如以下源碼所示&#xff1a; public ThreadPoolExe…

【最后203篇系列】028 FastAPI的后臺任務處理

說明 今天偶然在別的文章里看到這個功能&#xff0c;突然覺得正好。 CeleryWorker已經搭好了&#xff0c;但是我一直想在用戶請求時進行額外的處理會比較影響處理時間&#xff0c;用這個正好可以搭配上。 我設想的一個場景&#xff1a; 1 用戶發起請求2 接口中進行關鍵信息…

uboot下讀取ubifs分區的方法

在uboot 的defconfig中增加以下內容&#xff1a; CONFIG_MTDIDS_DEFAULT"nand0nand0" CONFIG_MTDPARTS_DEFAULT"mtdpartsnand0:1M(boot1),1M(boot2),1M(hwinfo),6M(kernel1),6M(kernel2),56M(rootfs1),56M(rootfs2),-(ubi2)" CONFIG_CMD_UBIy 其中&#x…

圖+文+語音一體化:多模態合成數據集構建的實戰與方法論

目錄 圖文語音一體化&#xff1a;多模態合成數據集構建的實戰與方法論 一、多模態合成數據的核心價值 二、系統架構概覽 三、核心模塊與實現建議 ? 1. 文→圖&#xff1a;圖像合成&#xff08;Text-to-Image&#xff09; ? 2. 圖→文&#xff1a;自動描述&#xff08;I…

linux驅動之poll

驅動中 poll 實現 在用戶空間實現事件操作的一個主要實現是調用 select/poll/epoll 函數。那么在驅動中怎么來實現 poll 的底層呢&#xff1f; 其實在內核的 struct file_operations 結構體中有一個 poll 成員&#xff0c;其就是底層實現的接口函數。 驅動中 poll 函數實現原…

第八篇:系統分析師第三遍——3、4章

目錄 一、目標二、計劃三、完成情況四、意外之喜(最少2點)1.計劃內的明確認知和思想的提升標志2.計劃外的具體事情提升內容和標志 五、總結 一、目標 通過參加考試&#xff0c;訓練學習能力&#xff0c;而非單純以拿證為目的。 1.在復習過程中&#xff0c;訓練快速閱讀能力、掌…

C++17 新特性簡解

C17 新特性簡解 一、核心語言特性 1. 結構化綁定&#xff08;Structured Bindings&#xff09; 用途&#xff1a;解構復合類型&#xff08;如元組、結構體&#xff09;為獨立變量 示例&#xff1a; #include <iostream> #include <tuple>int main() {// 解構 st…

PHP使用pandoc把markdown文件轉為word

文章目錄 首先安裝pandocPHP處理 服務器操作系統是Linux&#xff0c;centos 首先安裝pandoc yum install -y pandoc安裝完成后輸入如下代碼&#xff0c;檢查安裝是否成功 pandoc --versionPHP處理 我把markdown內容存到了數據庫里&#xff0c;所以要從數據庫讀取內容。對內容…

【Python學習筆記】Pandas實現Excel質檢記錄表初審、復核及質檢統計

背景&#xff1a; 我有這樣一個需要審核的飛書題目表&#xff0c;按日期分成多個sheet&#xff0c;有初審——復核——質檢三個環節&#xff0c;這三個環節是不同的同學在作業&#xff0c;并且領到同一個題目的人選是隨機的&#xff0c;也就是說&#xff0c;完成一道題的三個人…

守護進程編程、GDB調試以及外網連接樹莓派

目錄 一、什么是守護進程以及如何創建守護進程1. 什么是守護進程&#xff1f;2. 如何創建守護進程&#xff1f; 二、什么是GDB調試以及如何用GDB命令調試C程序1. 什么是GDB&#xff1f;2. 如何用GDB命令調試C程序&#xff1f; 三、外網訪問樹莓派 一、什么是守護進程以及如何創…

Logisim數字邏輯實訓——計數器設計與應用

4位遞增計數器 六進制計數器 十進制計數器 六十進制計數器 二十四進制計數器 計時器

發現“橫”字手寫有難度,對比兩個“橫”字

我發現手寫體“橫”字“好看”程度&#xff0c;難以比得上印刷體&#xff1a; 兩個從方正簡體啟體來的“橫”字&#xff1a; 哪個更好看&#xff1f;我是傾向于左邊一點。 <div style"transform: rotate(180deg); display: inline-block;"> 左邊是我從方正簡…