Java快速排序及求數(shù)組中第k小的值解析
快速排序
假設(shè)有一個(gè)如下數(shù)組,對(duì)其進(jìn)行快速排序
[2,90,4,67,234,1,87]
思路:選一個(gè)中間值,把數(shù)組中比它小的元素放到左邊,比它大的元素放到右邊,這時(shí)形成三個(gè)子數(shù)組,分別是中間值,比它大的數(shù)和比它小的數(shù),然后對(duì)前后兩個(gè)數(shù)組進(jìn)行遞歸
最好時(shí)間復(fù)雜度:O(NlogN)
最差時(shí)間復(fù)雜度:O(N^2)
代碼實(shí)現(xiàn)(java)
采用哨兵的概念,設(shè)數(shù)組最后一個(gè)元素為哨兵
public static void quickSort(int[] arr,int begin,int end){
//遞歸必須滿足條件:起始值小于終止值
if(begin<end){
//這個(gè)方法是確定數(shù)組哨兵在排序后的最終位置下標(biāo),由于哨兵左邊的數(shù)都小于哨兵,右邊的數(shù)都大于哨兵,所以對(duì)兩邊子數(shù)組進(jìn)行遞歸
int index = partition(arr,begin,end);
//對(duì)左邊的子數(shù)組進(jìn)行遞歸
quickSort(arr,begin,index-1);
//對(duì)右邊的數(shù)組進(jìn)行遞歸
quickSort(arr,index+1,end);
}
}
public static int partition(int[] arr,int begin,int end){
//將數(shù)組的最后一個(gè)元素作為哨兵
int pivot = arr[end];
//i為起始坐標(biāo)-1
int i = begin -1;
//對(duì)數(shù)組進(jìn)行遍歷,j從數(shù)組的第一個(gè)下標(biāo)開(kāi)始,當(dāng)j對(duì)應(yīng)元素小于哨兵時(shí),i加1,交換i和j對(duì)應(yīng)元素
for (int j = begin; j < end; j++) {
//當(dāng)
if(arr[j]<=pivot){
i++;
int tmp = arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
//遍歷結(jié)束后,交換arr[i+1]和哨兵的值
int tmp = arr[i+1];
arr[i+1]=arr[end];
arr[end]= tmp;
//i+1就是哨兵最終排序后對(duì)應(yīng)的下標(biāo)
return i+1;
}
過(guò)程演示:

求數(shù)組中第k小的值
分析:第k小的值,就是下標(biāo)為k-1的值
代碼實(shí)現(xiàn)(java)
public static int quickSortKMin(int[] arr,int begin,int end,int k){
//遞歸必須滿足條件:起始值小于等于終止值
if(begin<=end){
//這個(gè)方法是確定數(shù)組哨兵在排序后的最終位置下標(biāo),由于哨兵左邊的數(shù)都小于哨兵,右邊的數(shù)都大于哨兵,所以對(duì)兩邊子數(shù)組進(jìn)行遞歸
int index = partition(arr,begin,end);
//如果哨兵的下標(biāo)就等于k-1,那哨兵就是數(shù)組中第k小的值,直接輸出
if(index==k-1){
return arr[index];
}else if(index > k-1){
//如果k-1小于哨兵的下標(biāo),說(shuō)明在哨兵左側(cè),遞歸查找即可
return quickSortKMin(arr,begin,index-1,k);
}else{
//如果k-1大于哨兵的下標(biāo),說(shuō)明在哨兵右側(cè),遞歸查找即可
return quickSortKMin(arr,index+1,end,k);
}
}
return Integer.MIN_VALUE;
}
public static int partition(int[] arr,int begin,int end){
//將數(shù)組的最后一個(gè)元素作為哨兵
int pivot = arr[end];
//i為起始坐標(biāo)-1
int i = begin -1;
//對(duì)數(shù)組進(jìn)行遍歷,j從數(shù)組的第一個(gè)下標(biāo)開(kāi)始,當(dāng)j對(duì)應(yīng)元素小于哨兵時(shí),i加1,交換i和j對(duì)應(yīng)元素
for (int j = begin; j < end; j++) {
//當(dāng)
if(arr[j]<=pivot){
i++;
int tmp = arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
//遍歷結(jié)束后,交換arr[i+1]和哨兵的值
int tmp = arr[i+1];
arr[i+1]=arr[end];
arr[end]= tmp;
//i+1就是哨兵最終排序后對(duì)應(yīng)的下標(biāo)
return i+1;
}
到此這篇關(guān)于Java快速排序及求數(shù)組中第k小的值解析的文章就介紹到這了,更多相關(guān)Java快速排序及求數(shù)組值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaSE static final及abstract修飾符實(shí)例解析
這篇文章主要介紹了JavaSE static final及abstract修飾符實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
實(shí)戰(zhàn)干貨之基于SpringBoot的RabbitMQ多種模式隊(duì)列
RabbitMQ 是一個(gè)由Erlang語(yǔ)言開(kāi)發(fā)的AMQP的開(kāi)源實(shí)現(xiàn),支持多種客戶端。用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,在易用性、擴(kuò)展性、高可用性等方面表現(xiàn)不俗,下文將帶你深入了解 RabbitMQ 多種模式隊(duì)列2021-09-09
JavaBean valication驗(yàn)證實(shí)現(xiàn)方法示例
這篇文章主要介紹了JavaBean valication驗(yàn)證實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了JavaBean valication驗(yàn)證相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-03-03
IDEA的Swing可視化插件JFormDesigner詳解
JFormDesigner是一個(gè)專業(yè)的軟件應(yīng)用程序,專門用于幫助您開(kāi)發(fā)Java?Swing用戶界面,而無(wú)需具備編程技能。它可作為獨(dú)立實(shí)用程序使用,也可以將其用作各種IDE的插件,本文給大家介紹idea?Swing可視化插件,感興趣的朋友一起看看吧2022-06-06
關(guān)于Mybatis-Plus字段策略與數(shù)據(jù)庫(kù)自動(dòng)更新時(shí)間的一些問(wèn)題
這篇文章主要介紹了關(guān)于Mybatis-Plus字段策略與數(shù)據(jù)庫(kù)自動(dòng)更新時(shí)間的一些問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Java中使用instanceof判斷對(duì)象類型的示例
在List<Object>中遍歷Object時(shí),先判斷類型,再定向轉(zhuǎn)換,本文給大家介紹Java中使用instanceof判斷對(duì)象類型,感興趣的朋友跟隨小編一起看看吧2023-08-08

