圖解Java經(jīng)典算法快速排序的原理與實(shí)現(xiàn)
快速排序
通過一趟排序?qū)⒋旁胤殖瑟?dú)立的兩部分,其中一部分為比基準(zhǔn)數(shù)小的元素,另一部分則是比基準(zhǔn)數(shù)大的元素。然后對這兩部分元素再按照前面的算法進(jìn)行排序,直到每一部分的元素都只剩下一個(gè)。
本質(zhì)上來看,快速排序應(yīng)該算是在冒泡排序基礎(chǔ)上的遞歸分治法。
算法原理
- 從數(shù)列中挑出一個(gè)元素作為基準(zhǔn)點(diǎn)
- 重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面
- 然后基準(zhǔn)值左右兩邊,重復(fù)上述步驟
- 通過遞歸把基準(zhǔn)值元素左右兩側(cè)的數(shù)組排序,排完之后,整個(gè)數(shù)組就排序完成了
圖解
問題描述:
給定一個(gè)無序排列的數(shù)組 nums,使其能夠按照有序輸出
示例:
輸入: nums = [4,3,1,2,9,6],
輸出: nums = [1,2,3,4,6,9]
圖解如下:

Java代碼實(shí)現(xiàn)
核心代碼
public class QuickSort {
//比較 v 是否小于 w
public static boolean less(Comparable v,Comparable w){
return v.compareTo(w) < 0;
}
//數(shù)組元素交換位置
private static void swap(Comparable[] a,int i,int j){
Comparable temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
//排序
public static void sort(Comparable[] a){
int l = 0;
int h = a.length - 1;
sort(a,l,h);
}
private static void sort(Comparable[] a,int l,int h){
if (h <= l) return;
//對數(shù)組進(jìn)行分組(左右兩個(gè)數(shù)組)
// i 表示分組之后基準(zhǔn)值的索引
int i = partition(a, l, h);
//讓左邊的數(shù)組有序
sort(a,l,i - 1);
//讓有邊的數(shù)組有序
sort(a,i + 1,h);
}
public static int partition(Comparable[] a,int l,int h){
//確定基準(zhǔn)值
Comparable key = a[l];
//定義兩個(gè)指針
int left = l;
int right = h + 1;
//切分
while (true){
//從右向左掃描,移動right指針找一個(gè)比基準(zhǔn)值小的元素,找到就停止
while (less(key,a[--right])){
if (right == l)
break;
}
//從左向右掃描,移動left指針找一個(gè)比基準(zhǔn)值大的元素,找到就停止
while (less(a[++left],key)){
if (left == h)
break;
}
if (left>=right){
break;
}else {
swap(a,left,right);
}
}
//交換基準(zhǔn)值
swap(a,l,right);
return right;
}
}public class QuickSortTest {
public static void main(String[] args) {
Integer[] arr = {3,1,2,4,9,6};
QuickSort.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
//排序前:{3,1,2,4,9,6}
//排序后:{1,2,3,4,6,9}運(yùn)行結(jié)果:

算法分析
時(shí)間復(fù)雜度
快速排序的最佳情況就是每一次取到的元素都剛好平分整個(gè)數(shù)組,由于快速排序用到了遞歸調(diào)用,因此計(jì)算其時(shí)間復(fù)雜度也需要用到遞歸算法來計(jì)算。T[n] = 2T[n/2] + f(n);此時(shí)時(shí)間復(fù)雜度是O(nlogn)。最壞的情況,則和冒泡排序一樣,每次比較都需要交換元素,此時(shí)時(shí)間復(fù)雜度是O(n^2)。
因此,快速排序的時(shí)間復(fù)雜度為:O(nlogn)。
空間復(fù)雜度
空間復(fù)雜度主要是遞歸造成的??臻g的使用,最佳情況是,遞歸樹的深度為log2n,此時(shí)空間復(fù)雜度為O(logn),最壞情況,則需要進(jìn)行n‐1遞歸調(diào)用,此時(shí)空間復(fù)雜度為 O(n)。
因此,快速排序的空間復(fù)雜度為: O(logn)。
到此這篇關(guān)于圖解Java經(jīng)典算法快速排序的原理與實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java快速排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springmvc用于方法鑒權(quán)的注解攔截器的解決方案代碼
這篇文章主要介紹了springmvc用于方法鑒權(quán)的注解攔截器的解決方案代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
揭秘SpringBoot!一分鐘教你實(shí)現(xiàn)配置的動態(tài)神刷新
在今天的指南中,我們將深入探索SpringBoot?動態(tài)刷新的強(qiáng)大功能,讓你的應(yīng)用保持最新鮮的狀態(tài),想象一下,無需重啟,你的應(yīng)用就能實(shí)時(shí)更新配置,是不是很酷?跟我一起,讓我們揭開這項(xiàng)技術(shù)如何讓開發(fā)變得更加靈活和高效的秘密吧!2024-03-03
java中把漢字轉(zhuǎn)換成簡拼的實(shí)現(xiàn)代碼
本篇文章是對在java中把漢字轉(zhuǎn)換成簡拼的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
gradle和maven打包時(shí)排除application.properties問題
文章主要介紹了Gradle、Maven(用于構(gòu)建JAR包)和Maven(用于構(gòu)建WAR包),文章基于個(gè)人經(jīng)驗(yàn),為讀者提供了參考,并鼓勵(lì)大家支持腳本之家2024-12-12
JAVA自定義注解實(shí)現(xiàn)接口/ip限流的示例代碼
本文主要介紹了JAVA自定義注解實(shí)現(xiàn)接口/ip限流的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
struts2.3.24+spring4.1.6+hibernate4.3.11+mysql5.5.25開發(fā)環(huán)境搭建圖文
這篇文章主要介紹了struts2.3.24+spring4.1.6+hibernate4.3.11+mysql5.5.25開發(fā)環(huán)境搭建圖文教程,感興趣的小伙伴們可以參考一下2016-06-06

