快速排序的新用法

普通快排

簡介

快速排序是一種高效的排序算法,利用分治的思想進行排序。它的基本原理是在待排序的n個數據中任取一個數據為分區標準,把所有小于該排序碼的數據移到左邊,把所有大于該排序碼的數據移到右邊,中間放所選記錄,稱之為一趟排序。然后,對前后兩個子序列重復上述過程,直到所有記錄都排好序。通俗點說,大致過程是對于一個無序序列,找到一個"哨兵數",將序列中所有比哨兵數小的數字都移在哨兵數的左邊,所有比哨兵數大的數字都移在哨兵數的右邊;然后分別對哨兵數左邊和右邊再使用同樣的方法找到新的哨兵數,并再次進行分類,直到集合不可分割為止。

過程

實現快速排序的過程大致如下:

  1. 從數組的中間位置開始,取出一個數字作為臨時變量;
  2. 然后再從數組的右邊開始遍歷,尋找一個值比臨時變量小的數,挖出這個數來,對上一個坑進行填坑;
  3. 然后從數組前面遍歷,尋找一個比臨時變量大的數,填上面的坑。

以上是快速排序的基本步驟,需要注意的是,在實際的編程實現中,還需要處理一些特殊情況,例如當待排序數組為空或只有一個元素時。

public class QuickSort {  public static void quickSort(int[] arr, int left, int right) {  if (left < right) {  int pivotIndex = partition(arr, left, right);  quickSort(arr, left, pivotIndex - 1);  quickSort(arr, pivotIndex + 1, right);  }  }  private static int partition(int[] arr, int left, int right) {  int pivot = arr[right]; // 選擇最右邊的數作為哨兵數  int i = left - 1; // i指向比哨兵數小的數所在的位置  for (int j = left; j < right; j++) {  if (arr[j] <= pivot) {  i++;  swap(arr, i, j); // 將比哨兵數小的數移到左邊  }  }  swap(arr, i + 1, right); // 將哨兵數移到正確的位置上  return i + 1; // 返回哨兵數的位置  }  private static void swap(int[] arr, int i, int j) {  int temp = arr[i];  arr[i] = arr[j];  arr[j] = temp;  }  
}

?運行結果

int[] arr = {9, 2, 7, 5, 1};  
QuickSort.quickSort(arr, 0, arr.length - 1);  
System.out.println(Arrays.toString(arr)); // 輸出 [1, 2, 5, 7, 9]

省下一個變量空間的快排

步驟

這個實現的基本步驟是:

  1. 選擇一個"哨兵數"(這里選擇的是數組的第一個元素),并將數組分為兩部分,一部分是小于哨兵數的元素,另一部分是大于哨兵數的元素。這個操作由partition函數完成。
  2. 對小于哨兵數的元素和大于哨兵數的元素分別進行遞歸排序。也就是說,對這兩部分再分別調用quickSort函數進行排序。

partition函數中,核心的思路是利用兩個指針,一個從數組的右邊開始向左移動,另一個從數組的左邊開始向右移動。當左邊的指針找到的數小于等于哨兵數,而右邊的指針找到的數大于哨兵數時,交換這兩個數。這樣,經過一段時間后,左邊的指針就會碰到第一個小于哨兵數的數,右邊的指針就會碰到第一個大于哨兵數的數。這個時候,將哨兵數放到這兩個數的中間位置。這樣,就完成了一趟排序。

詳細講解

讓我來為你講解一下這段Java代碼實現的快速排序算法。

首先,我們定義了一個名為quickSort的靜態方法,它接受一個整數數組arr以及兩個索引lowhigh作為參數。這個方法用于對數組的一部分進行排序,其中low是起始索引,而high是結束索引。

quickSort方法中,我們首先檢查low是否小于high。如果不是,說明數組已經排好序了,我們直接返回。

接下來,我們調用partition方法來對數組進行分區。這個方法會選擇一個"哨兵數",然后將數組分為兩部分:一部分是小于哨兵數的元素,另一部分是大于哨兵數的元素。這個過程是通過交換元素的位置來實現的。

然后,我們對小于哨兵數的元素和大于哨兵數的元素分別遞歸調用quickSort方法進行排序。這樣,我們就可以保證在每一層遞歸中,都比上一層的排序更加精確。

接下來,我們來看看partition方法的實現。在這個方法中,我們選擇數組的最后一個元素作為哨兵數。然后,我們使用兩個指針,一個從數組的左邊開始向右移動,另一個從數組的右邊開始向左移動。當左邊的指針找到的數小于等于哨兵數,而右邊的指針找到的數大于哨兵數時,交換這兩個數。這樣,經過一段時間后,左邊的指針就會碰到第一個小于哨兵數的數,右邊的指針就會碰到第一個大于哨兵數的數。這個時候,將哨兵數放到這兩個數的中間位置。這樣,就完成了一趟排序。

最后,返回的是排好序的數組。你可以使用循環遍歷輸出數組中的每個元素來查看排序結果。

?

package com.learn;public class QuickSort {public static void main(String[] args) {int[] arr = {3, 8, 2, 5, 1, 4, 7, 6};quickSort(arr, 0, arr.length - 1);for (int i : arr) {System.out.print(i + " ");}}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);}}public static int partition(int[] arr, int low, int high) {int pivot = arr[low];//會有優化while (low < high) {while (low < high && arr[high] >= pivot) {high--;}arr[low] = arr[high];while (low < high && arr[low] <= pivot) {low++;}arr[high] = arr[low];}arr[low] = pivot;return low;}
}

?

?

?

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

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

相關文章

Spring 之 @Cacheable 緩存使用教程

1、Cacheable 指定使用緩存 定義個 Controller &#xff0c;在方法上加上注解 Cacheable&#xff0c;配置要使用哪些緩存&#xff0c;比如 myMapCache 表示一級緩存是 Map&#xff0c;myRedisCache 表示二級緩存是 Redis。并配置緩存 key。 key 由 SPEL 表達式組成&#xff0c…

異常檢測 | MATLAB實現BiLSTM(雙向長短期記憶神經網絡)數據異常檢測

異常檢測 | MATLAB實現BiLSTM(雙向長短期記憶神經網絡)數據異常檢測 目錄 異常檢測 | MATLAB實現BiLSTM(雙向長短期記憶神經網絡)數據異常檢測效果一覽基本介紹模型準備模型設計參考資料效果一覽 基本介紹 訓練一個雙向 LSTM 自動編碼器來檢測機器是否正常工作。 自動編碼器接受…

CleanMyMac X2024最新版本軟件實用性測評

信大多數MAC用戶都較為了解&#xff0c;Mac雖然有著許多亮點的性能&#xff0c;但是讓用戶叫苦不迭的還其硬盤空間小的特色&#xff0c;至于很多人因為文件堆積以及軟件緩存等&#xff0c;造成系統空間內存不夠使用的情況。于是清理工具就成為了大多數MAC用戶使用頻率較高的實用…

二十一章網絡通信

計算機網絡實現了多臺計算機間的互聯&#xff0c;使得它們彼此之間能夠進行數據交流。網絡應用程序就是在已連接的不同計算機上運行的程序&#xff0c;這些程序借助于網絡協議&#xff0c;相互之間可以交換數據。編寫網絡應用程序前&#xff0c;首先必須明確所要使用的網絡協議…

數據采集工具的大全【都是免費值得收藏】

數據是推動業務成功的關鍵之一。為了獲取準確、全面的信息&#xff0c;數據采集成為了許多企業和個人的必備工作。本文將專注于數據采集工具&#xff0c;探討其在全網和指定網站采集方面的優勢&#xff0c;為大家提供對比分析&#xff0c;以幫助大家找到最適合的數據采集利器。…

算法復習——6種排序方法的簡單回顧

算法復習——6種排序方法的簡單回顧 常見排序方法&#xff1a;冒泡排序、選擇排序、插入排序、堆排序、歸并排序、快速排序的簡單回顧 冒泡排序 重復“從序列右邊開始比較相鄰兩個數字的大小,再根據結果交換兩個數字的位置” 在冒泡排序中&#xff0c;第 1 輪需要比較 n - 1…

Tair(1):Tair介紹

1 介紹 ? 在Tair出現之前的很長一段時間里&#xff0c;像redis、memcache這些知名NoSql數據庫是不支持分布式的&#xff0c;在這樣的背景下&#xff0c;由淘寶網自主開發并在2010.6開源的一個高性能、高擴展、高可靠分布式緩存&#xff0c;類似map的key/value結構&#xff0c…

使用單例模式+觀察者模式實現參數配置實時更新

使用vector存儲觀察者列表 #include <iostream> #include <vector> #include <functional> #include <algorithm>// 配置參數結構體 struct MyConfigStruct {int parameter1;std::string parameter2; };class Config { public:using Observer std::f…

hive 命令行中使用 replace 和nvl2 函數報錯

1.有時候在命令行的情況下使用 replace 函數時會報錯 這個時候可以使用 translate 代替 2.有時候使用 nvl2() 函數的時候會報錯 這個時候可以用 case when 來代替

【Spring 源碼】 深入理解 Bean 定義之 BeanDefinition

&#x1f680; 作者主頁&#xff1a; 有來技術 &#x1f525; 開源項目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 倉庫主頁&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 歡迎點贊…

兩數之和問題

更好的閱讀體驗請點擊 兩數之和。 題目&#xff1a;兩數之和 ? 給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 ? 你可以假設每種輸入只會對應一個答案。但是&#xff…

MetricBeat監控Redis

目錄 一、安裝部署 二、開啟Redis監控模塊 三、編輯Redis配置文件 四、啟動Metricbeat 五、查看監控圖表 一、安裝部署 metriceat的安裝部署參考章節&#xff1a; 監控組件>Metricbeat安裝使用&#xff0c;這里不再贅述。 二、開啟Redis監控模塊 進入metricbeat安裝目錄…

【每日一題】出租車的最大盈利

文章目錄 Tag題目來源解題思路方法一&#xff1a;遞歸方法二&#xff1a;遞歸記錄數組記憶化搜索方法三&#xff1a;動態規劃&#xff08;遞推&#xff09; 寫在最后 Tag 【遞歸】【記憶化搜索】【動態規劃】【數組】【2023-12-08】 題目來源 2008. 出租車的最大盈利 解題思路…

【EI會議征稿中】2024年第四屆人工智能、自動化與高性能計算國際會議(AIAHPC 2024)

2024年第四屆人工智能、自動化與高性能計算國際會議&#xff08;AIAHPC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Automation and High Performance Computing 2024第四屆人工智能、自動化與高性能計算國際會議(AIAHPC 2024)將于20…

藍橋杯從零開始備戰(Python組)---基礎知識篇

第一次嘗試報名藍橋杯的Python組&#xff0c;好好備戰&#xff0c;希望省賽可以拿獎&#xff01;目前是整理了一些Python的常用函數和常用內置庫&#xff0c;后面可能會開始刷題&#xff0c;如果有比較需要記住的知識點&#xff0c;會再寫一篇刷題篇 一、輸入輸出 1.輸入字符…

游戲被攻擊怎么辦

隨著科技的進步和互聯網的普及&#xff0c;游戲行業也正在經歷前所未有的變革。玩家們不再滿足于傳統的線下游戲&#xff0c;而是轉向了線上游戲。然而&#xff0c;隨著游戲的線上化&#xff0c;游戲安全問題也日益凸顯。游戲受到攻擊是游戲開發者永遠的痛點&#xff0c;談“D“…

HomeAssistant添加HACS插件并實現公網控制米家,HomeKit等智能家居

HomeAssistant添加HACS插件并實現公網控制米家&#xff0c;HomeKit等智能家居 文章目錄 HomeAssistant添加HACS插件并實現公網控制米家&#xff0c;HomeKit等智能家居基本條件一、下載HACS源碼二、添加HACS集成三、綁定米家設備 ? 上文介紹了如何實現群暉Docker部署HomeAssist…

【嵌入式開發 Linux 常用命令系列 4.1 -- git push 遠程分支與本地分支查看】

文章目錄 概述git push 語法步驟1&#xff1a;git 遠程主機名查看步驟2&#xff1a;git 遠程分支名查看步驟3&#xff1a;git 本地分支名查看示例演示 概述 在日常工作中&#xff0c;將代碼 git clone 本地之后&#xff0c;或者使用repo init && repo sync 之后不知道…

SQLserver截取字符串

當我們存的數據是json的時候可以全部取出在模糊查詢但是有多個重復數據的時候就沒辦法準確的模糊出來這個時候我們就需要用的字符串截取 --創建函數create FUNCTION [dbo].[Fmax] (str varchar(50),start VARCHAR(50),length VARCHAR(50)) RETURNS varchar(max) AS BEGINDEC…

商品詳情頁評論和評論列表評論的排序html代碼

以下是一個簡單的商品詳情頁的 HTML 代碼示例&#xff1a; <!DOCTYPE html> <html> <head><title>商品詳情頁</title><style>/* CSS 樣式可以在這里添加 */</style> </head> <body><h1>商品詳情頁</h1><…