www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 公眾號精選 > 嵌入式客棧
[導讀]關注、星標 嵌入式客棧 ,干貨及時送達 [導讀] 前面文章《聊聊改變世界的5大算法》,一文中提到快速排序算法對世界影響巨大,估計很多人不以為然,本文來嘗試解讀一下為啥。 快排有多快 說到快我只推崇葵花寶典,那叫一個快啊~~~ 皮一下哈哈,言歸正傳???

關注、星標 嵌入式客棧 ,干貨及時送達


[導讀] 前面文章《聊聊改變世界的5大算法,一文中提到快速排序算法對世界影響巨大,估計很多人不以為然,本文來嘗試解讀一下為啥。

快排有多快

說到快我只推崇葵花寶典,那叫一個快啊~~~

皮一下哈哈,言歸正傳??焖倥判蛩惴ㄈ缙涿粯樱?!來看看快排和其他幾大排序算法的并行運行對比視頻(中間那個就是快排),你就知道它到底有多快了,請全屏橫屏播放更清晰:

啥是快排?

分治思想

  • 從待排元素集中選取一個元素作為擺動基準pivot,pivot這詞比較形象,記為P
  • 將元素重新排列為3個子塊:
  1. 左子塊S1:由 P的元素組成
  2. 中間塊M:僅有P一個元素
  3. 右子塊S2:由≥P的元素組成
  • 對左子塊S1和右子塊S2遞歸地重復上述過程,Return {quicksort(S 1 ), P, quicksort(S 2 )}.
  • 代碼實現(xiàn)

    代碼如下:

    typedef int T_ELEMENT; int partition(T_ELEMENT A[ ], int left, int right); /* sort A[left..right] */ void quicksort(T_ELEMENT A[ ], int left, int right) { int q; if( right <= left ) return; if ( right > left )
      {  
         q = partition(A, left, right); /* partition分塊后 */ //-> A[left..q-1] ≤ A[q] ≤ A[q+1..right] quicksort(A, left, q-1);     
         quicksort(A, q+1, right);
       } 
    } int partition(T_ELEMENT A[], int left, int right);
    { 
        T_ELEMENT P = A[left];
        i = left;
        j = right + 1; /*無限循環(huán),使用break退出*/ for(;;) 
        { while (A[++i] < P) if (i >= right) break; /* 此時 A[i] ≥ P */ while (A[--j] > P) if (j <= left) break; /* 此時 A[j] ≤ P */ if (i >= j ) break; /*退出for循環(huán)*/ else swap(A[i], A[j]); 
        } if (j == left) return j ;
        swap(A[left], A[j]); return j;
    }

    舉栗子分析:

    分成三塊了,再遞歸子塊迭代,直到right<=left.

    算法分析

    • 這種快速排序的優(yōu)點是我們可以“就地”排序,即無需依賴于輸入大小的臨時緩沖區(qū)。沒有緩沖區(qū)內(nèi)存開銷,僅有棧開銷。(注還有一種非遞歸的棧實現(xiàn)版本,本文就先不聊了)
    • partition步驟:時間復雜度為θ(n)。
    • 快速排序涉及分區(qū)和2個遞歸調(diào)用。故:

    T(n) = θ(n) + T(i) + T(n-i-1) = cn+ T(i) + T(n-i-1)

    其中,i是分區(qū)后第一個子塊的大小,將T(0)=T(1)= 1作為初始條件。

    • 具體運行時間對不同特性的待排數(shù)據(jù),其結果差異比較大,來看一下最好、最壞以及平均情況分析。

    最差情況

    • 當待排數(shù)據(jù)序列為正序或者逆序時,pivot將是在大小為n的待排塊時中的最?。ɑ蜃畲螅┰貢r。則階段1迭代中生成一個空子塊、pivot,及一個大小(n-1)的子塊,則時間復雜度為θ(n)
    • 遞歸方程:

    如果這種情況在每個分區(qū)中都重復發(fā)生,那么每個遞歸調(diào)用處理一個比前一個列表小1的列表。因此需要在達到大小為1的列表之前進行n - 1次嵌套調(diào)用。這意味著調(diào)用樹是n - 1個嵌套調(diào)用的線性鏈。第i次調(diào)用需要做O(n-i)復雜度來進行分區(qū),則

    最好情況

    • 如每次分區(qū)時樞軸(pivot)都能取到中間值,即每次分區(qū)后,將產(chǎn)生兩個大小大致相等的子塊,并且樞軸(pivot)元素處于中間值位置,需要做n次比較運算。

    • 遞歸方程:


    如前所說,如每次執(zhí)行分區(qū)時,都能將列表分成兩個幾乎相等的兩個子塊。這意味著每次遞歸調(diào)用都要處理一個只有一半大小的列表。因此,在到達大小為1的列表之前,我們只能進行 嵌套調(diào)用。這意味著調(diào)用樹的深度為 ,但是在調(diào)用樹的同一級別上沒有兩個調(diào)用處理原始列表的相同部分;因此,每個級別的調(diào)用總共只需要O(n)個時間(每個調(diào)用都有一些固定的開銷,但是由于每個級別上只有O(n)個調(diào)用,所以這被包含在O(n)因子中)。結果是,該算法只使用c(n log n)的時間。故時間復雜度為O(n log n)。

    平均情況

    要對n個不同元素的數(shù)組進行排序,快速排序需要O(n log n)的預期時間,推導很枯燥就不羅嗦了。

    其他排序算法

    注:快排不需要額外的緩沖區(qū)開銷,但是需要棧開銷,其空間復雜度為O(log n).

    這里對上表其中幾個效率相對較高的做個簡要介紹,后面如有機會再深入學習總結:

    • Introsort內(nèi)省排序,在C++ STL中有應用。內(nèi)省排序(英語:Introsort)是由David Musser在1997年設計的排序算法。這個排序算法首先從快速排序開始,當遞歸深度超過一定深度(深度為排序元素數(shù)量的對數(shù)值)后轉(zhuǎn)為堆排序。采用這個方法,內(nèi)省排序既能在常規(guī)數(shù)據(jù)集上實現(xiàn)快速排序的高性能,又能在最壞情況下仍保持O(n log n) 的時間復雜度。由于這兩種算法都屬于比較排序算法,所以內(nèi)省排序也是一個比較排序算法。

    • Timsort排序算法:是一種混合穩(wěn)定排序算法,它是從合并排序和插入排序中派生而來的,旨在對多種實際數(shù)據(jù)表現(xiàn)良好。由Tim Peters在2002年實現(xiàn),用于Python編程語言。該算法查找已排序(運行)的數(shù)據(jù)的子序列,并使用它們對其余部分進行更有效的排序。這是通過合并運行直到滿足特定條件來完成的。自2.3版以來,Timsort一直是Python的標準排序算法。還應用在Android平臺上的Java SE 7、GNU Octave(是一個開源的類MATLAB數(shù)序軟件)、V8(開源Java script引擎)以及Swift中,用于對非原始類型的數(shù)組進行排序。

    • MergeSort歸并排序:在計算機科學中,是一種高效的,通用的,基于比較的排序算法。大多數(shù)實現(xiàn)產(chǎn)生穩(wěn)定的排序,這意味著相等元素的順序在輸入和輸出中是相同的。歸并排序是約翰·馮·諾伊曼(John von Neumann)在1945年發(fā)明的分而治之算法。早在1948年,Goldstine和von Neumann的報告就對自下而上的合并排序進行了詳細描述和分析。

    • Tournament sort:通過使用優(yōu)先級隊列來查找排序中的下一個元素,它改進了選擇排序。在原始的選擇排序中,需要O(n)個操作才能選擇n個元素中的下一個元素;在錦標賽排序中,需要進行O(log n)運算(在O(n)中建立初始錦標賽之后)。錦標賽排序是堆排序的一種變體。

    • 樹形選擇排序又稱錦標賽排序(Tournament Sort:是一種按照錦標賽的思想進行選擇排序的方法。首先對n個記錄的關鍵字進行兩兩比較,然后在 個較小者之間再進行兩兩比較,如此重復,直至選出最小的記錄為止。

    • 塊排序或塊合并排序Block sort: 它將至少兩個合并操作與插入排序組合在一起,以達到O(n log n)的位置穩(wěn)定排序。合并兩個排序的列表,A和B,等價于將A分成大小相等的塊,在特殊規(guī)則下將每個塊插入到B中,并合并AB對。

    • 平滑排序smoothsort,是一種基于比較的排序算法。它是堆排序的一種變體,由Edsger Dijkstra于1981年發(fā)明并發(fā)布。它的時間復雜度上限是O(n log n),但它不是一個穩(wěn)定的排序。平滑排序的優(yōu)點是,如果輸入已經(jīng)排序到一定程度,那么它會更接近O(n)的時間,而堆排序的平均值是O(n log n),而不管初始排序狀態(tài)如何。

    • 希爾排序Shellsort,也稱為Shell排序或Shell的方法,是一種就地比較排序。它可以被看作是交換排序(冒泡排序)或插入排序(插入排序)的泛化。該方法首先對彼此相距很遠的元素對進行排序,然后逐步縮小要比較的元素之間的差距。通過從相隔很遠的元素開始,它可以比簡單的最近鄰交換更快地將一些位置錯誤的元素移動到正確的位置。Donald Shell在1959年出版了第一個版本。Shellsort的運行時間很大程度上依賴于它使用的間隙序列。

    算法應用

    說到排序算法復雜度,請一定要與應用場景結合。主要需要考慮待排數(shù)據(jù)的集的尺寸,如果數(shù)據(jù)量小的時候反而是插入排序算法應用最為廣泛;而對于海量數(shù)據(jù)場合,則應使用漸近有效排序策略。這是什么意思呢?說白了就是常使用混合算法!主要策略是利用快速排序、堆排序或歸并排序?qū)⒄w快速分治排序,同時對遞歸底部的小列表采用插入排序。事實上,在實際應用中有更復雜的變體,例如在Android,Java和Python中使用的Timsort(合并排序,插入排序和其他邏輯),以及在某些C++中用的introsort(快速排序和堆排序) 在.NET中排序?qū)崿F(xiàn)。

    再說白一點,在海量數(shù)據(jù)場景,利用快速排序、堆排序或歸并排序?qū)⒑A繑?shù)據(jù)快速迭代成收斂的小塊,而在小塊中采用最為常見的插入排序盡快完成小塊排序,小塊中采用插入排序則可以更大程度減少遞歸深度。

    總結一下

    在信息時代,有海量信息需要處理,即便有非常強勁的處理器,但如沒有很好的算法,仍然無法滿足對這些信息的處理。在處理過程中,免不了要進行信息進行排序,快排在時空兩個維度的開銷都比較均衡,大量的應用軟件、開發(fā)工具以及軟件包都基于快排做了大量的應用。所以說快速排序改變世界,個人認為并不為過。同時對于求職面試,快速排序算法也是高頻面試主題,值得深入研究掌握。

    原創(chuàng)不易,如覺得本文有價值,請點再看或者分享給身邊的小伙伴,讓更多看到。

    END

    往期精彩推薦,點擊即可閱讀




    Linux內(nèi)核中I2C總線及設備長啥樣? [強烈推薦]
    學習AI之機器學習概念篇
    手把手教系列之IIR數(shù)字濾波器設計實現(xiàn)


    免責聲明:本文內(nèi)容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

    本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
    換一批
    延伸閱讀

    9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

    關鍵字: 阿維塔 塞力斯 華為

    加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

    關鍵字: AWS AN BSP 數(shù)字化

    倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

    關鍵字: 汽車 人工智能 智能驅(qū)動 BSP

    北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

    關鍵字: 亞馬遜 解密 控制平面 BSP

    8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

    關鍵字: 騰訊 編碼器 CPU

    8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

    關鍵字: 華為 12nm EDA 半導體

    8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

    關鍵字: 華為 12nm 手機 衛(wèi)星通信

    要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

    關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

    北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

    關鍵字: VI 傳輸協(xié)議 音頻 BSP

    北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

    關鍵字: BSP 信息技術
    關閉
    關閉