圖解Java經(jīng)典算法快速排序的原理與實(shí)現(xiàn)
快速排序
通過一趟排序?qū)⒋旁胤殖瑟?dú)立的兩部分,其中一部分為比基準(zhǔn)數(shù)小的元素,另一部分則是比基準(zhǔn)數(shù)大的元素。然后對(duì)這兩部分元素再按照前面的算法進(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; //對(duì)數(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){ //從右向左掃描,移動(dòng)right指針找一個(gè)比基準(zhǔn)值小的元素,找到就停止 while (less(key,a[--right])){ if (right == l) break; } //從左向右掃描,移動(dòng)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ù)雜度主要是遞歸造成的棧空間的使用,最佳情況是,遞歸樹的深度為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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)上傳文件到oss(阿里云)功能示例
這篇文章主要介紹了java實(shí)現(xiàn)上傳文件到oss(阿里云)功能,結(jié)合實(shí)例形式詳細(xì)分析了java上傳文件到阿里云的具體步驟、配置及相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-11-11詳解Java編程規(guī)約(命名風(fēng)格、常量定義、代碼格式)
這篇文章主要介紹了詳解Java編程規(guī)約(命名風(fēng)格、常量定義、代碼格式),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-10-10java編程創(chuàng)建型設(shè)計(jì)模式單例模式的七種示例
這篇文章主要為大家介紹了java編程中創(chuàng)建型設(shè)計(jì)模式之單例模式的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02解決Eclipse的Servers視圖中無法添加Tomcat6/Tomcat7的方法
這篇文章主要介紹了解決Eclipse的Servers視圖中無法添加Tomcat6/Tomcat7的方法的相關(guān)資料,需要的朋友可以參考下2017-02-02java書店系統(tǒng)畢業(yè)設(shè)計(jì) 用戶模塊(3)
這篇文章主要介紹了java書店系統(tǒng)畢業(yè)設(shè)計(jì),第三步系統(tǒng)總體設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10SpringBoot 實(shí)戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法
本篇文章主要介紹了SpringBoot 實(shí)戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05