摘要:快排可以說是一道必知的常見面試題,同時也有多種實現方式。之所以使用隨機快速排序而不是普通的快排。其中交換數組元素位置,打印元素的方法我就沒貼了,代碼太長你們也不方便看。
快排可以說是一道必知的常見面試題,同時也有多種實現方式。在這篇文章中,我使用的是隨機三路快排。
之所以使用隨機快速排序而不是普通的快排。是因為前者可以使得數列有序的概率降低,從而使隨機快速排序平均速度是比快速排序要快的。具體的兩者的性能差別可以看下這篇文章:
https://blog.csdn.net/haelang...
talk id cheap,show the code。一共 20+ 行代碼,每行代碼都有注釋。其中交換數組元素位置,打印元素的方法我就沒貼了,代碼太長你們也不方便看。
PS:代碼下面有執行流程圖,結合代碼來看比較容易理解。
public static void main(String[] args) { // 測試數據 int[] arr = new int[]{5, 3, 6, 4}; // 執行快排 quickSort(arr, 0, arr.length - 1); // 打印數組元素 printArray(arr); } private static void quickSort(int[] arr, int l, int r) { if (l < r) { // 隨機取需要排序的數組中的一個元素和數組的最后一個元素交換,作為劃分值 swap(arr, l + (int) (Math.random() * (r - l + 1)), r); // 得到數組元素中等于劃分值的區域 int[] part = partition(arr, l, r); // 小于等于劃分值的區域 quickSort(arr, l, part[0] - 1); // 大于劃分值的區域 quickSort(arr, part[1] + 1, r); } } private static int[] partition(int[] arr, int l, int r) { // 初始化小于等于劃分值區域的當前下標,默認是數組第一個元素的前一個位置 int less = l - 1; // 初始化大于劃分值區域的當前下標,默認是數組最后一個元素的位置,同時也是劃分值的位置,但該值并不屬于大于劃分值的區域,所以要在最后進行移動 int more = r; // 當前下標小于大于劃分值區域的下標時 while (l < more) { // 當前值比劃分值小,當前值和小于等于劃分值區域的右邊第一個值進行交換,小于等于劃分值區域右移1個下標,當前下標+1 if (arr[l] < arr[r]) { swap(arr, l++, ++less); // 當前值比劃分值大,當前值和大于劃分值區域的左邊第一個值進行交換,大于劃分值的區域左移1個下標 } else if (arr[l] > arr[r]) { swap(arr, l, --more); // 當前值等于劃分值,當前下標+1 } else { // 當前下標+1 l++; } } // 將劃分值和大于劃分值區域中,最接近劃分值區域的元素交換。至此完成所有值的區域劃分 swap(arr, more, r); // 返回等于劃分值的區域 return new int[]{less + 1, more}; }
下面我會畫個流程圖幫大家理解一下,測試數據和代碼一樣。
假設代碼執行完 13 行后,測試數據的順序依舊不變,即為 {5,3,6,4}。
接下來在執行 partition() 方法的過程中,數組元素的情況如下圖所示(靈魂寫手求輕噴)
好了,以上就是本文的全部內容,我們下篇文章再見,捂臉逃~
PS:本文原創發布于微信公眾號「不只Java」,后臺回復「Java」,送你 13 本 Java 經典電子書。公眾號專注分享 Java 干貨、讀書筆記、成長思考
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72160.html
摘要:與異步編程按照維基百科上的解釋獨立于主控制流之外發生的事件就叫做異步。因為的存在,至少在被標準化的那一刻起,就支持異步編程了。然而異步編程真正發展壯大,的流行功不可沒。在握手過程中,端點交換認證和密鑰以建立或恢復安全會話。 1、前端 排序算法總結 排序算法可能是你學編程第一個學習的算法,還記得冒泡嗎? 當然,排序和查找兩類算法是面試的熱門選項。如果你是一個會寫快排的程序猿,面試官在比較...
摘要:與異步編程按照維基百科上的解釋獨立于主控制流之外發生的事件就叫做異步。因為的存在,至少在被標準化的那一刻起,就支持異步編程了。然而異步編程真正發展壯大,的流行功不可沒。在握手過程中,端點交換認證和密鑰以建立或恢復安全會話。 1、前端 排序算法總結 排序算法可能是你學編程第一個學習的算法,還記得冒泡嗎? 當然,排序和查找兩類算法是面試的熱門選項。如果你是一個會寫快排的程序猿,面試官在比較...
摘要:與異步編程按照維基百科上的解釋獨立于主控制流之外發生的事件就叫做異步。因為的存在,至少在被標準化的那一刻起,就支持異步編程了。然而異步編程真正發展壯大,的流行功不可沒。在握手過程中,端點交換認證和密鑰以建立或恢復安全會話。 1、前端 排序算法總結 排序算法可能是你學編程第一個學習的算法,還記得冒泡嗎? 當然,排序和查找兩類算法是面試的熱門選項。如果你是一個會寫快排的程序猿,面試官在比較...
摘要:客戶端的瀏覽器根據雙方同意的安全等級,建立會話密鑰,然后利用網站的公鑰將會話密鑰加密,并傳送給網站。地址必須和一個網絡掩碼對應使用缺一不可。網絡掩碼的主要作用是告訴計算機如何從地址中析取網絡標識和主機標識。 霸面的是前端實習生崗位,當時聽同學說前端缺人,還特意設了一個霸面區,就去溜了個彎兒,畢竟不試試,怎么知道自己有多菜呢o( ̄︶ ̄)o一面技術面,面試官關注的點一直在數據結構、算法、計...
閱讀 2872·2021-10-14 09:42
閱讀 3186·2019-08-30 15:52
閱讀 3279·2019-08-30 14:02
閱讀 1117·2019-08-29 15:42
閱讀 541·2019-08-29 13:20
閱讀 1168·2019-08-29 12:24
閱讀 488·2019-08-26 10:20
閱讀 689·2019-08-23 18:31