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)結構確定控制流(實例)
下面小編就為大家?guī)硪黄狫ava使用條件語句和循環(huán)結構確定控制流(實例)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06基于SpringAI+DeepSeek實現(xiàn)流式對話功能
一般來說大模型的響應速度通常是很慢的,為了避免用戶用戶能夠耐心等待輸出的結果,我們通常會使用流式輸出一點點將結果輸出給用戶,那么問題來了,想要實現(xiàn)流式結果輸出,后端和前端要如何配合?下來本文給出具體的實現(xiàn)代碼,需要的朋友可以參考下2025-02-02IntelliJ IDEA 構建maven多模塊工程項目(詳細多圖)
這篇文章主要介紹了IntelliJ IDEA 構建maven多模塊工程項目(詳細多圖),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06