欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java快速排序及求數組中第k小的值解析

 更新時間:2023年11月14日 09:20:39   作者:哇哈哈水有點甜  
這篇文章主要介紹了Java快速排序及求數組中第k小的值解析,選一個中間值,把數組中比它小的元素放到左邊,比它大的元素放到右邊,這時形成三個子數組,分別是中間值,比它大的數和比它小的數,然后對前后兩個數組進行遞歸,需要的朋友可以參考下

快速排序

假設有一個如下數組,對其進行快速排序

[2,90,4,67,234,1,87]

思路:選一個中間值,把數組中比它小的元素放到左邊,比它大的元素放到右邊,這時形成三個子數組,分別是中間值,比它大的數和比它小的數,然后對前后兩個數組進行遞歸

最好時間復雜度:O(NlogN)

最差時間復雜度:O(N^2)

代碼實現(xiàn)(java)

采用哨兵的概念,設數組最后一個元素為哨兵

public static void quickSort(int[] arr,int begin,int end){
    //遞歸必須滿足條件:起始值小于終止值
    if(begin<end){
        //這個方法是確定數組哨兵在排序后的最終位置下標,由于哨兵左邊的數都小于哨兵,右邊的數都大于哨兵,所以對兩邊子數組進行遞歸
        int index = partition(arr,begin,end);
        //對左邊的子數組進行遞歸 
        quickSort(arr,begin,index-1);
        //對右邊的數組進行遞歸
        quickSort(arr,index+1,end);
    }
}
public static int partition(int[] arr,int begin,int end){
    //將數組的最后一個元素作為哨兵
    int pivot = arr[end];
    //i為起始坐標-1
    int i = begin -1;
    //對數組進行遍歷,j從數組的第一個下標開始,當j對應元素小于哨兵時,i加1,交換i和j對應元素
    for (int j = begin; j < end; j++) {
        //當
        if(arr[j]<=pivot){
            i++;
          int tmp = arr[i];
          arr[i]=arr[j];
          arr[j]=tmp;
        }
    }
    //遍歷結束后,交換arr[i+1]和哨兵的值
    int tmp = arr[i+1];
    arr[i+1]=arr[end]; 
    arr[end]= tmp;
    //i+1就是哨兵最終排序后對應的下標
    return i+1;
}

過程演示:

在這里插入圖片描述

求數組中第k小的值

分析:第k小的值,就是下標為k-1的值

代碼實現(xiàn)(java)

public static int quickSortKMin(int[] arr,int begin,int end,int k){
    //遞歸必須滿足條件:起始值小于等于終止值
    if(begin<=end){
        //這個方法是確定數組哨兵在排序后的最終位置下標,由于哨兵左邊的數都小于哨兵,右邊的數都大于哨兵,所以對兩邊子數組進行遞歸
        int index = partition(arr,begin,end);
        //如果哨兵的下標就等于k-1,那哨兵就是數組中第k小的值,直接輸出
        if(index==k-1){
            return arr[index];
        }else if(index > k-1){
            //如果k-1小于哨兵的下標,說明在哨兵左側,遞歸查找即可
            return quickSortKMin(arr,begin,index-1,k);
        }else{
            //如果k-1大于哨兵的下標,說明在哨兵右側,遞歸查找即可
            return quickSortKMin(arr,index+1,end,k);
        }
    }
    return Integer.MIN_VALUE;
}


public static int partition(int[] arr,int begin,int end){
    //將數組的最后一個元素作為哨兵
    int pivot = arr[end];
    //i為起始坐標-1
    int i = begin -1;
    //對數組進行遍歷,j從數組的第一個下標開始,當j對應元素小于哨兵時,i加1,交換i和j對應元素
    for (int j = begin; j < end; j++) {
        //當
        if(arr[j]<=pivot){
            i++;
          int tmp = arr[i];
          arr[i]=arr[j];
          arr[j]=tmp;
        }
    }
    //遍歷結束后,交換arr[i+1]和哨兵的值
    int tmp = arr[i+1];
    arr[i+1]=arr[end];
    arr[end]= tmp;
    //i+1就是哨兵最終排序后對應的下標
    return i+1;
}

到此這篇關于Java快速排序及求數組中第k小的值解析的文章就介紹到這了,更多相關Java快速排序及求數組值內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java使用條件語句和循環(huán)結構確定控制流(實例)

    Java使用條件語句和循環(huán)結構確定控制流(實例)

    下面小編就為大家?guī)硪黄狫ava使用條件語句和循環(huán)結構確定控制流(實例)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 使用SpringSecurity 進行自定義Token校驗

    使用SpringSecurity 進行自定義Token校驗

    這篇文章主要介紹了使用SpringSecurity 進行自定義Token校驗操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Springboot啟動流程詳細分析

    Springboot啟動流程詳細分析

    這篇文章主要介紹了SpringBoot啟動過程的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-12-12
  • Java8中的lambda表達式入門教程

    Java8中的lambda表達式入門教程

    lambda表達式,即帶有參數的表達式,為了更清晰地理解lambda表達式,下面通過示例代碼給大家介紹java8 lambda 表達式入門教程,感興趣的朋友一起看看吧
    2017-08-08
  • 淺談java中HashMap鍵的比較方式

    淺談java中HashMap鍵的比較方式

    今天帶大家了解一下java中HashMap鍵的比較方式,文中有非常詳細的解釋說明及代碼示例,對正在學習java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • 基于java實現(xiàn)DFA算法代碼實例

    基于java實現(xiàn)DFA算法代碼實例

    這篇文章主要介紹了基于java實現(xiàn)DFA算法代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • 基于SpringAI+DeepSeek實現(xiàn)流式對話功能

    基于SpringAI+DeepSeek實現(xiàn)流式對話功能

    一般來說大模型的響應速度通常是很慢的,為了避免用戶用戶能夠耐心等待輸出的結果,我們通常會使用流式輸出一點點將結果輸出給用戶,那么問題來了,想要實現(xiàn)流式結果輸出,后端和前端要如何配合?下來本文給出具體的實現(xiàn)代碼,需要的朋友可以參考下
    2025-02-02
  • Java網絡編程之簡單的服務端客戶端應用實例

    Java網絡編程之簡單的服務端客戶端應用實例

    這篇文章主要介紹了Java網絡編程之簡單的服務端客戶端應用,以實例形式較為詳細的分析了java網絡編程的原理與服務器端客戶端的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • Java小程序求圓的周長和面積實例

    Java小程序求圓的周長和面積實例

    這篇文章主要介紹了首先用蒙塔卡洛算法求圓周率近似值,然后根據此近似值輸出圓的周長和面積,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • IntelliJ IDEA 構建maven多模塊工程項目(詳細多圖)

    IntelliJ IDEA 構建maven多模塊工程項目(詳細多圖)

    這篇文章主要介紹了IntelliJ IDEA 構建maven多模塊工程項目(詳細多圖),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06

最新評論