成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

面試官:快排會寫嗎?

UCloud / 1464人閱讀

摘要:快排可以說是一道必知的常見面試題,同時也有多種實現(xiàn)方式。之所以使用隨機快速排序而不是普通的快排。其中交換數(shù)組元素位置,打印元素的方法我就沒貼了,代碼太長你們也不方便看。

快排可以說是一道必知的常見面試題,同時也有多種實現(xiàn)方式。在這篇文章中,我使用的是隨機三路快排。

之所以使用隨機快速排序而不是普通的快排。是因為前者可以使得數(shù)列有序的概率降低,從而使隨機快速排序平均速度是比快速排序要快的。具體的兩者的性能差別可以看下這篇文章:

https://blog.csdn.net/haelang...

talk id cheap,show the code。一共 20+ 行代碼,每行代碼都有注釋。其中交換數(shù)組元素位置,打印元素的方法我就沒貼了,代碼太長你們也不方便看。

PS:代碼下面有執(zhí)行流程圖,結合代碼來看比較容易理解。

public static void main(String[] args) {                                             
     // 測試數(shù)據(jù)                              
     int[] arr = new int[]{5, 3, 6, 4}; 
     // 執(zhí)行快排
     quickSort(arr, 0, arr.length - 1);         
     // 打印數(shù)組元素              
     printArray(arr);                           
 }  
 
private static void quickSort(int[] arr, int l, int r) {               
     if (l < r) {                                                       
         // 隨機取需要排序的數(shù)組中的一個元素和數(shù)組的最后一個元素交換,作為劃分值                          
         swap(arr, l + (int) (Math.random() * (r - l + 1)), r);       
         // 得到數(shù)組元素中等于劃分值的區(qū)域                                             
         int[] part = partition(arr, l, r);                             
         // 小于等于劃分值的區(qū)域                                                  
         quickSort(arr, l, part[0] - 1);                                
         // 大于劃分值的區(qū)域                                                    
         quickSort(arr, part[1] + 1, r);                                
     }                                                                  
 }   

private static int[] partition(int[] arr, int l, int r) {                                                                   
    // 初始化小于等于劃分值區(qū)域的當前下標,默認是數(shù)組第一個元素的前一個位置                                                                                   
    int less = l - 1;                                                                                                       
    // 初始化大于劃分值區(qū)域的當前下標,默認是數(shù)組最后一個元素的位置,同時也是劃分值的位置,但該值并不屬于大于劃分值的區(qū)域,所以要在最后進行移動                                                 
    int more = r;                                                                                                           
    // 當前下標小于大于劃分值區(qū)域的下標時                                                                                                    
    while (l < more) {                                                                                                      
        // 當前值比劃分值小,當前值和小于等于劃分值區(qū)域的右邊第一個值進行交換,小于等于劃分值區(qū)域右移1個下標,當前下標+1                                                         
        if (arr[l] < arr[r]) {                                                                                              
            swap(arr, l++, ++less);                                                                                         
            // 當前值比劃分值大,當前值和大于劃分值區(qū)域的左邊第一個值進行交換,大于劃分值的區(qū)域左移1個下標                                                               
        } else if (arr[l] > arr[r]) {                                                                                       
            swap(arr, l, --more);                                                                                           
            // 當前值等于劃分值,當前下標+1                                                                                              
        } else {      
            // 當前下標+1                                                                                          
            l++;                                                                                                            
        }                                                                                                                   
    }                                                                                                                       
    // 將劃分值和大于劃分值區(qū)域中,最接近劃分值區(qū)域的元素交換。至此完成所有值的區(qū)域劃分                                                                             
    swap(arr, more, r);                                                                                                     
    // 返回等于劃分值的區(qū)域                                                                                                           
    return new int[]{less + 1, more};                                                                                       
} 

下面我會畫個流程圖幫大家理解一下,測試數(shù)據(jù)和代碼一樣。

假設代碼執(zhí)行完 13 行后,測試數(shù)據(jù)的順序依舊不變,即為 {5,3,6,4}。

接下來在執(zhí)行 partition() 方法的過程中,數(shù)組元素的情況如下圖所示(靈魂寫手求輕噴)

好了,以上就是本文的全部內(nèi)容,我們下篇文章再見,捂臉逃~

PS:本文原創(chuàng)發(fā)布于微信公眾號「不只Java」,后臺回復「Java」,送你 13 本 Java 經(jīng)典電子書。公眾號專注分享 Java 干貨、讀書筆記、成長思考

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/72160.html

相關文章

  • 前端排序算法總結;前端面試題2.0;JavaScript異步編程

    摘要:與異步編程按照維基百科上的解釋獨立于主控制流之外發(fā)生的事件就叫做異步。因為的存在,至少在被標準化的那一刻起,就支持異步編程了。然而異步編程真正發(fā)展壯大,的流行功不可沒。在握手過程中,端點交換認證和密鑰以建立或恢復安全會話。 1、前端 排序算法總結 排序算法可能是你學編程第一個學習的算法,還記得冒泡嗎? 當然,排序和查找兩類算法是面試的熱門選項。如果你是一個會寫快排的程序猿,面試官在比較...

    aaron 評論0 收藏0
  • 前端排序算法總結;前端面試題2.0;JavaScript異步編程

    摘要:與異步編程按照維基百科上的解釋獨立于主控制流之外發(fā)生的事件就叫做異步。因為的存在,至少在被標準化的那一刻起,就支持異步編程了。然而異步編程真正發(fā)展壯大,的流行功不可沒。在握手過程中,端點交換認證和密鑰以建立或恢復安全會話。 1、前端 排序算法總結 排序算法可能是你學編程第一個學習的算法,還記得冒泡嗎? 當然,排序和查找兩類算法是面試的熱門選項。如果你是一個會寫快排的程序猿,面試官在比較...

    ARGUS 評論0 收藏0
  • 前端排序算法總結;前端面試題2.0;JavaScript異步編程

    摘要:與異步編程按照維基百科上的解釋獨立于主控制流之外發(fā)生的事件就叫做異步。因為的存在,至少在被標準化的那一刻起,就支持異步編程了。然而異步編程真正發(fā)展壯大,的流行功不可沒。在握手過程中,端點交換認證和密鑰以建立或恢復安全會話。 1、前端 排序算法總結 排序算法可能是你學編程第一個學習的算法,還記得冒泡嗎? 當然,排序和查找兩類算法是面試的熱門選項。如果你是一個會寫快排的程序猿,面試官在比較...

    April 評論0 收藏0
  • 記一次騰訊霸面---前端

    摘要:客戶端的瀏覽器根據(jù)雙方同意的安全等級,建立會話密鑰,然后利用網(wǎng)站的公鑰將會話密鑰加密,并傳送給網(wǎng)站。地址必須和一個網(wǎng)絡掩碼對應使用缺一不可。網(wǎng)絡掩碼的主要作用是告訴計算機如何從地址中析取網(wǎng)絡標識和主機標識。 霸面的是前端實習生崗位,當時聽同學說前端缺人,還特意設了一個霸面區(qū),就去溜了個彎兒,畢竟不試試,怎么知道自己有多菜呢o( ̄︶ ̄)o一面技術面,面試官關注的點一直在數(shù)據(jù)結構、算法、計...

    ralap 評論0 收藏0

發(fā)表評論

0條評論

UCloud

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<