摘要:算法介紹由在年提出,因?yàn)榇怂惴ǘ@得圖靈獎(jiǎng)。它是一種遞歸算法,核心思想是先找出一個(gè)數(shù)的應(yīng)該在的位置,將數(shù)列分為左右兩部分,左右兩部分分別進(jìn)行排序。
算法介紹
由C.A.R.Hoare在1962年提出,因?yàn)榇怂惴ǘ@得圖靈獎(jiǎng)。它是一種遞歸算法,核心思想是:先找出一個(gè)數(shù)的應(yīng)該在的位置,將數(shù)列分為左右兩部分,左右兩部分分別進(jìn)行排序。
圖片示例我們先找到 K 的位置,i 指針先向后移動(dòng),所指元素如果比K大,就停止,此時(shí)再由 j 由隊(duì)尾向前遍歷,如果 j 指向元素比K小,j 停止移動(dòng),此時(shí)將 i 和 j 指向元素對調(diào)。
比如:
此時(shí) i 指向元素R比 K 大,j 指向元素C比K小 ,對調(diào)R,C。
此時(shí) i j 根據(jù)上述規(guī)則 繼續(xù)移動(dòng),一直到 指針 j 超過了i ,K 和 j 對調(diào)
此時(shí)K已經(jīng)在位置上了,將數(shù)列分為左右兩邊,左右再進(jìn)行遞歸排序
實(shí)現(xiàn)代碼//主方法 private static void sort(Comparable[] a, int lo, int hi) { if (lo >= hi) { return; } int j = partition(a, lo, hi); sort(a, 0, j - 1); sort(a, j + 1, hi); } private static int partition(Comparable[] a, int lo, int hi) { int i = lo ; int j = hi+1; //a[lo]即為第一個(gè)元素,先將它的位置找到 while (true){ // 找到 i ,i 小于 a[lo]的話,繼續(xù)移動(dòng) while (less(a[++i],a[lo])){ if(i == hi){ break; } } // j 也類似 while (less(a[lo],a[--j])){ if(j==lo){ break; } } // 兩指針擦肩而過的話,就跳出循環(huán) if(i>=j){ break; } // 交換 i和j change(a,i,j); } // 交換 lo和j change(a,lo,j); return j; }復(fù)雜度推導(dǎo)
假設(shè) Cn 為快速排序N個(gè)數(shù)需要比較的次數(shù)。
找到第一個(gè)數(shù)所在位置,我們需要比較 N+1次。指針 i 和 j 每移動(dòng)一次就需要比較一次,一共是 N-1次, 加上相遇比較一次 ,擦肩而過還需要比較一次,所以是N+1次。
這個(gè)數(shù)會(huì)把數(shù)組分割成各種情況,會(huì)分割成(1,n-1),(2,n-2),(3,n-3).......(n-1,1)各種情況,所以Cn的表達(dá)式如下:
平均復(fù)雜度為1.39NlgN
缺點(diǎn)與不足1. 為了保證性能,快速排序前一定要打亂數(shù)組順序,正序下,快排復(fù)雜度需要1/2 乘以n的二次方 2. 如果數(shù)組存在大量相同的數(shù),性能也是平方級的
第一次寫博客,這是我的理解,如果有誤請指出,我會(huì)立即糾正,謝謝
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69118.html
摘要:在本書中你將學(xué)習(xí)比較不同算法的優(yōu)缺點(diǎn)該使用合并排序算法還是快速排序算法或者該使用數(shù)組還是鏈表。這樣的算法包括快速排序一種速度較快的排序算法。 在讀《算法圖解》這本書,這本書有兩個(gè)優(yōu)點(diǎn): 手繪風(fēng)格的圖,看著很讓人入戲; 算法采用Python語言描述,能更好的表達(dá)算法思想。 關(guān)于算法的學(xué)習(xí)有兩點(diǎn)心得: 算法思想最重要,理解了思想,算法是很容易寫出來的,所以盡量不要把過多精力放在細(xì)節(jié)上...
摘要:上一篇中已經(jīng)介紹了幾個(gè)簡單的排序算法,這一篇文章我將繼續(xù)向大家介紹排序算法相關(guān)的內(nèi)容,本篇的會(huì)介紹希爾排序快速排序歸并排序以及分治算法的思想,希望通過本文章能夠加深大家對排序算法的理解。 上一篇中已經(jīng)介紹了幾個(gè)簡單的排序算法,這一篇文章我將繼續(xù)向大家介紹排序算法相關(guān)的內(nèi)容,本篇的會(huì)介紹希爾排序、快速排序、歸并排序以及分治算法的思想,希望通過本文章能夠加深大家對排序算法的理解。 希爾排序...
摘要:選擇排序是下一章將介紹的快速排序的基石。需要存儲(chǔ)多項(xiàng)數(shù)據(jù)時(shí)有兩種基本方式數(shù)組和鏈表。但它們并非都適用于所有的情形因此知道它們的差別很重要。選擇排序是一種靈巧的算法但其速度不是很快。 選擇排序是下一章將介紹的快速排序的基石。 內(nèi)存的工作原理 計(jì)算機(jī)就像是很多抽屜的集合體,每個(gè)抽屜都有地址。showImg(https://segmentfault.com/img/bVbpWvv?w=413...
摘要:再談大表示法快速排序的獨(dú)特之處在于其速度取決于選擇的基準(zhǔn)值。在平均情況下快速排序的運(yùn)行時(shí)間為在最糟情況下退化為??焖倥判蚝秃喜⑴判虻乃惴ㄋ俣确謩e表示為和,是算法所需的固定時(shí)間量被稱為常量。 分而治之 分而治之(divide and conquer,D&C)是一種著名的遞歸式問題解決方法。只能解決一種問題的算法畢竟用處有限,而D&C提供了解決問題的思路,是另一個(gè)可供你使用的工具。 D&C...
摘要:此專欄文章是對力扣上算法題目各種方法的總結(jié)和歸納整理出最重要的思路和知識(shí)重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn)當(dāng)然也會(huì)加上我對導(dǎo)圖的詳解目的是為了更方便快捷的記憶和回憶算法重點(diǎn)不用每次都重復(fù)看題解畢竟算法不是做了一遍就能完全記住的所 ...
閱讀 3599·2023-04-26 02:55
閱讀 2866·2021-11-02 14:38
閱讀 4146·2021-10-21 09:39
閱讀 2856·2021-09-27 13:36
閱讀 3967·2021-09-22 15:08
閱讀 2657·2021-09-08 10:42
閱讀 2811·2019-08-29 12:21
閱讀 678·2019-08-29 11:22