摘要:快排是一種不穩(wěn)定的排序算法,在經(jīng)過排序后,等值的元素的相對(duì)位置可能發(fā)生改變。
聲明:碼字不易,轉(zhuǎn)載請(qǐng)注明出處,歡迎文章下方討論交流。
前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會(huì)不定時(shí)更新,歡迎各位讀者監(jiān)督。本篇文章介紹排序算法中最常用也是面試中最容易考到的排序算法——快排,包括快排的思想和原理、java快排代碼、快排的特點(diǎn)性能和快排的適用場(chǎng)景。
0、其他排序算法索引(待更)java數(shù)據(jù)結(jié)構(gòu)與算法——桶排序
java數(shù)據(jù)結(jié)構(gòu)與算法——插入排序
事實(shí)上,快速排序是堆冒泡排序的一種改進(jìn)。
它的基本思想是:通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割為兩部分,第一部分所有數(shù)據(jù)比第二部分的所有數(shù)據(jù)小,按照這種思路將兩部分?jǐn)?shù)據(jù)再次分別進(jìn)行快速排序,可以使用遞歸完成,最終使得整個(gè)數(shù)據(jù)序列有序。
具體來講,在待排數(shù)據(jù)中找一個(gè)基準(zhǔn)數(shù)據(jù)(通常取第一個(gè)數(shù)),接下來將待排數(shù)據(jù)中比基準(zhǔn)數(shù)據(jù)小的放在待排數(shù)據(jù)的左側(cè),將比待排數(shù)據(jù)中比基準(zhǔn)數(shù)據(jù)大的放在待排數(shù)據(jù)右側(cè)。此時(shí),左右兩個(gè)分區(qū)的元素相對(duì)有序,接著采用上述思路繼續(xù)對(duì)左右兩個(gè)分區(qū)繼續(xù)排序,直到各分區(qū)只有一個(gè)元素位置。這里用到了一個(gè)典型的分治思想。下面舉例說明:
待排序列依次為47、29、71、99、78、19、24、47。為了區(qū)分兩個(gè)47,將后面的47下面增加一個(gè)下劃線。
步驟:
1、選取一個(gè)基準(zhǔn)數(shù),一般選第0個(gè)元素47。
2、將比基準(zhǔn)數(shù)小的移動(dòng)到左側(cè),比基準(zhǔn)數(shù)大的移動(dòng)到右側(cè),相等的不移動(dòng),此時(shí)基準(zhǔn)數(shù)位置為K。
3、對(duì)左右兩側(cè)重復(fù)步驟1和步驟2,直到左右側(cè)細(xì)分到只有一個(gè)元素。
快排的難點(diǎn)也就是在第2步,怎么移動(dòng)各個(gè)數(shù)據(jù)?
<1> 首先從數(shù)列的右邊開始往左找,設(shè)下標(biāo)為i,也就是i--操作,找到第一個(gè)比基準(zhǔn)數(shù)小的值,讓他與基準(zhǔn)數(shù)交換;
<2> 接著開始從左往右找,設(shè)下標(biāo)為j,也就是j++,找到第一個(gè)比基準(zhǔn)數(shù)大的值,讓他與基準(zhǔn)數(shù)交換位置;
<3> 重復(fù)1和2,直到i和j相遇時(shí)結(jié)束,最后基準(zhǔn)值所在位置為k。
public class QuickSort { private int[] array; public QuickSort(int[] array){ this.array = array; } public void printSort(){ for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } public void sort(){ quicksort(array,0,array.length -1); } private void quicksort(int[] array,int begin,int end){ if(beginbase){ //從右往左掃,如果元素比基準(zhǔn)值大 j--; //則右邊標(biāo)記--,直到找到第一個(gè)比基準(zhǔn)值小的,停止掃描 } if(i 測(cè)試代碼
public class SortTest { public static void main(String[] args) { teseQuickSort(); } private static void teseQuickSort(){ int[] array = {3,5,7,3,8,9,6,1,0}; QuickSort qs = new QuickSort(array); qs.sort(); qs.printSort(); } }3、快排的特點(diǎn)及性能快排是在冒泡排序之上改進(jìn)而來的,冒泡排序每次只能交換相鄰的兩個(gè)元素,而快排則是跳躍式的交換,交換距離很大,總的比較次數(shù)和交換次數(shù)少了很多,速度也快了很多。
快排的平均時(shí)間復(fù)雜度為O(nlogn),事實(shí)上,大多數(shù)情況下,排序速度要快于這個(gè)時(shí)間復(fù)雜度。快排實(shí)際上是采用的一種分而治之的思想,把問題分解為一個(gè)個(gè)的小問題去逐一解決,最終在把結(jié)果組合起來。
快排因?yàn)檫f歸調(diào)用,所以空間復(fù)雜度為O(logn)。
快排是一種不穩(wěn)定的排序算法,在經(jīng)過排序后,等值的元素的相對(duì)位置可能發(fā)生改變。
快排基本上被認(rèn)為是相同數(shù)量級(jí)中所有排序算法中平均性能最好的。
4、快排的適用場(chǎng)景快排由于相對(duì)簡(jiǎn)單而且性能不錯(cuò),所以快排適用于幾乎絕大多數(shù)場(chǎng)合。
其他排序算法索引(待更)
java數(shù)據(jù)結(jié)構(gòu)與算法——桶排序
java數(shù)據(jù)結(jié)構(gòu)與算法——插入排序碼字不易,如對(duì)您有幫助,歡迎點(diǎn)贊收藏打賞^_^
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/71079.html
摘要:穩(wěn)定與不穩(wěn)定算法示例以下圖片解釋了穩(wěn)定和不穩(wěn)定的排序是如何工作的這就是穩(wěn)定和不穩(wěn)定排序算法之間的區(qū)別。穩(wěn)定排序算法的一些常見示例是合并排序,插入排序和冒泡排序。 showImg(https://segmentfault.com/img/remote/1460000018913243); 來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Slogan | 連接每個(gè)程序員的故事 網(wǎng)...
摘要:前面介紹了七大算法的思想與實(shí)現(xiàn)步驟,下面來做一個(gè)歸總。直到無序區(qū)中的數(shù)為零,結(jié)束排序。步驟以從小到大為例,排序數(shù)組大小為。比較完以后則排序結(jié)束。堆排序思想堆排序是采用樹的形式的數(shù)據(jù)結(jié)構(gòu)來進(jìn)行排序的,其中每一個(gè)堆都是完全二叉樹。 前面介紹了七大算法的思想與實(shí)現(xiàn)步驟,下面來做一個(gè)歸總。 排序方法 平均復(fù)雜度 最壞復(fù)雜度 最好復(fù)雜度 輔助空間 穩(wěn)定性 直接選擇排序 O(n^2...
摘要:當(dāng)序列本身有序時(shí),插入排序的時(shí)間復(fù)雜度為。因?yàn)榇藭r(shí)的分區(qū)內(nèi)數(shù)據(jù)往往是近似有序的,所以使用快排并不一定優(yōu)于插入排序。 聲明:碼字不易,轉(zhuǎn)載請(qǐng)注明出處,歡迎文章下方討論交流。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會(huì)不定時(shí)更新,歡迎各位讀者監(jiān)督。本篇文章介紹排序算法中插入排序算法,包括插入排序的思路,適用場(chǎng)景,性能分析,java代碼等 0、其他排序算法索引(待更) java數(shù)據(jù)結(jié)構(gòu)與算法——快速...
摘要:排序算法和集合工具類排序算法和集合工具類。面試官總是問排序算法也不是在難為你,而是在考察你的編程功底。你首先要理解多線程不僅僅是和那么簡(jiǎn)單,整個(gè)并發(fā)包下面的工具都是在為多線程服務(wù)。 去年的這個(gè)時(shí)候樓主通過兩個(gè)月的復(fù)習(xí)拿到了阿里巴巴的 offer,有一些運(yùn)氣,也有一些心得,借著跳槽季來臨特此分享出來。簡(jiǎn)單梳理一下我的復(fù)習(xí)思路,同時(shí)也希望和大家一起交流討論,一起學(xué)習(xí),如果不對(duì)之處歡迎指正一...
摘要:代碼片段語言組織能力有限,直接上代碼排序算法之快速排序參數(shù)為需要排序的數(shù)組參數(shù)為數(shù)組的起始下角標(biāo)即參數(shù)為數(shù)組的最后下角標(biāo)即經(jīng)過一輪排序,已經(jīng)將數(shù)組分為左右兩部分進(jìn)行遞歸排序總結(jié)快速排序的精髓在于分治思想,分而治之,它的時(shí)間復(fù)雜度為。 算法簡(jiǎn)述 所謂快速排序算法是基于交換排序和遞歸思想的,它的速度的確如名字所示——快!并且這種一算一般被用作數(shù)量級(jí)比較大的數(shù)據(jù)當(dāng)中,在大數(shù)據(jù)中有著很重要的地...
閱讀 1839·2021-09-22 15:23
閱讀 3269·2021-09-04 16:45
閱讀 1874·2021-07-29 14:49
閱讀 2773·2019-08-30 15:44
閱讀 1524·2019-08-29 16:36
閱讀 1042·2019-08-29 11:03
閱讀 1510·2019-08-26 13:53
閱讀 509·2019-08-26 11:57