力扣(LeetCode)- 常見的排序算法總結

2020-12-26 隋浩楠的原創文章

1. 如何分析一個排序算法好壞

時間複雜度、比較和交換次數、原地排序(空間複雜度為(1))、排序穩定性(相等元素之間的位置先後順序不變)。

有序度:是數組中具有有序關係的元素對的個數

逆序度:和有序度相反。

選擇排序是不穩定排序,所以應用最少。

2. 插入排序比冒泡排序哪個好?

插入排序好。原因有如下兩點:

冒泡和插入雖然時間複雜度都是O(n2) ,元素移動次數都是等於逆序度,但是冒泡排序比插入排序多了三個賦值操作,性能有損耗,如下代碼://冒泡排序數據交換 if(a[j] >a[j+1]) { inttmp=a[j]; a[j] =a[j+1]; a[j+1] =tmp; flag=true; } //插入排序數據交換: if (a[j] >value) { a[j+1] =a[j]; }插入排序比冒泡排序有更多的優化空間,比如希爾排序。3. 常見的排序算法總結

4. 排序算法原理描述

冒泡排序移動相鄰位置的兩個數據,重複執行。插入排序把數組分為兩個區間,已排序和未排序區間。把數據從未排序區間插入已排序區間的合適位置。選擇排序分已排序和未排序區間,從未排序中找到最小的元素,放到已排序區間的額末尾。原地排序、不穩定排序、最好最壞平均時間複雜度都是O(n2)。歸併排序Merge Sort分治思想。假如把數組下標從x到y開始排序,不斷的把數組一分為二,直到x>=y,結束。然後merge。建立一個臨時數組,大小和要比較的數組大小相同,也就是A[x,y]。我們用兩個遊標 i 和 j,分別指向 A[x...q] 和 A[q+1...y] 的第一個元素。比較這兩個元素 A[i] 和 A[j],如果 A[i]<=A[j],我們就把 A[i] 放 入到臨時數組 tmp,並且 i 後移一位,否則將 A[j] 放入到數組 tmp,j 後移一位。繼續上述比較過程,直到其中一個子數組中的所有數據都放入臨時數組中,再把另一個數組中的數 據依次加入到臨時數組的末尾,這個時候,臨時數組中存儲的就是兩個子數組合併之後的結果了。最後再把臨時數組 tmp 中的數據拷貝到原數組 A[x...y] 中。穩定排序算法。時間複雜度都是O(nlogn) ,與原始數據是否有序無關。不是原地排序算法。快速排序 Quicksort從數組下標p到r,任意選一個數據作為pivot(分區點,一般選p到r最後一個),將小於pivot的數據放左邊,大於放右邊。然後將pivot左側和右側繼續按照此方式排序,直到區間為1。桶排序(Bucket sort)將數據分成若干個有順序的桶,每個桶內單獨排序,然後依次取出就是有順序了。計數排序(Counting sort)找出數組中最大的元素k,然後分成k個桶,每個桶內數據是相同的,桶之間就是排序好的數據。和桶排序的的大小力度不同。基數排序(Radix sort)對排序數據有要求,數據分隔不同的位,比較完前面的大小,數據後面的位數就不需要比較了。

如果讀完有收穫,歡迎關注[知否]公眾號,你也可以訪問官方網站[https://www.zhifou.net],更多精彩內容等著你!

推薦閱讀:

超詳細JVM虛擬機內存區域詳解

並發編程系列之 Synchronized原理分析

看過這篇「同步異步阻塞非阻塞詳解」,我徹底懂了

並發編程系列之Java內存模型(JMM)

JAVA中異常,你都理解了嗎?

面試中常問的單例設計模式

一文搞懂CAP理論

你應該知道的分布式事務之BASE理論

JAVA自學之路

點讚是最大的支持

相關焦點

  • 力扣354——俄羅斯套娃信封問題(排序+動態規劃)
    雖然是困難題,但直觀的DP就能做思路首先排序,後面一定不會存在比當前信封更大的信封
  • JS家的排序算法
    它是一本很好的針對前端開發者們的入門算法書籍,可是,它有一個很大的缺陷,就是裡面有很多明顯的小錯誤,明顯到就連我這種半路出家的程序猿都能一眼看出來。還有一個問題是,很多重要的算法和數據結構知識並沒有在這本書裡被提到。這些問題對於作為一個晚期強迫症患者的我來說簡直不能忍。於是乎,一言不合我就決定自己找資料總結算法。那麼,我就從算法領域裡最基礎的知識點——排序算法總結起好了。
  • 快速掌握Java的希爾排序與快速排序算法
    排序算法,是作為程式設計師的基礎算法,也是一定要具備的,如剛從學校出來或者剛轉行過來的夥伴,筆者的建議是要掌握這些基礎的算法,這一篇講解的是希爾排序和快速排序,後續講解哈希表。從此,希爾排序誕生,它就是解決插入排序的更加高效。希爾排序希爾排序在1959年提出而得名,英文Shell’s Sort,它是一種插入排序,又稱「縮小增量排序」。這種插入排序算法比傳統的插入排序算法更加高效。這種算法是非常的穩定。
  • 排序算法:歸併排序
    在日常開發中經常會遇到一類問題,就是對一個集合的數據進行排序掌握一些排序算法,對於日常開發是非常有幫助今天介紹一下歸併排序法01算法邏輯02時間複雜度由上圖邏輯可以得出,歸併排序的循環次數為由算法導論的主定理可以推導出,可見之前的文章(文末有連結)歸併排序的時間複雜度為03空間複雜度由上圖邏輯可以得出,歸併排序每次分解都是要復一份新的數據片段
  • LeetCode-72.編輯距離(Edit Distance)
    :5解釋:intention -> inention (刪除 't')inention -> enention (將 'i' 替換為 'e')enention -> exention (將 'n' 替換為 'x')exention -> exection (將 'n' 替換為 'c')exection -> execution (插入 'u')來源:力扣
  • 推薦一種通過刷leetcode來增強技術功底的方法
    而要找到上面這些問題的答案,比較好的方式除了看一些理論性文章和接受培訓之外,自己動手刷一刷leetcode切身實踐一下不失為一個不錯的方式。而既然要花精力去做這件事情,那就需要解決一個問題:我從中可以獲得什麼提高。以下是個人的一些經驗和感受。
  • 力扣拓展企業服務 技術職業化迎來新轉機
    4 月 29 日,IT 技術職業化提昇平臺力扣(LeetCode)宣布拓展企業服務,這是一套為企業量身定做的技術人才解決方案,充分結合矽谷先進經驗和力扣多年沉澱,幫助企業打造強勁技術引擎。
  • Python中排序算法的重要性,希爾排序 ShellSort,中級python技術
    Python中排序算法的重要性排序是計算機科學中最深入研究的算法之一。有許多不同的排序實現和應用程式,您可以使用它們來提高代碼的效率。55 65 97下面給出嚴格按照定義來寫的希爾排序關於排序算法,我總結了幾篇,大家有興趣可以去瀏覽下:
  • 力扣進軍企服領域,IT 技術職業化按下「加速鍵」
    在由領扣網絡引入中國成立「力扣中國」後,力扣並不再局限於純技術提升,它關注的是職業化的技術成長,即通過算法與數據結構的相關訓練提升用戶的核心技能,為此後的求職、工作等一系列職業化進程鋪平道路。為此,力扣不僅持續豐富核心的高質量原創編程題庫、完善在線判題服務、舉辦「力扣杯」等全球性算法競賽,還針對性地推出了極客交流社區等新功能,並全方位升級模擬面試板塊,為程式設計師提供了高效的技術提升途徑。國內用戶迅速增長的同時,力扣也一躍成為網際網路技術職業化教育頭部品牌。
  • 【算法知識】詳解直接插入排序算法
    】詳解選擇冒泡算法【算法知識】詳解選擇排序算法在玩撲克牌的時候,我們抽到一張牌的時候,都是將它插入到當前手中牌的合適位置的。如下圖:(上圖來自算法導論)直接插入排序也是這樣的思想。基本思想 插入排序的思想是:將待排序序列分成兩個序列,前面的序列保持有序,依次選取後面的序列的元素,在前面的序列中進行插入。初始時,有序序列的長度為1。
  • 力扣前400題解答筆記,全被字節大神整理到了這份文檔裡
    再加上,身邊大佬朋友都在說算法的重要性,看來,我真的需要重新考慮「程序」的定義了。看下邊嚴肅版的官方定義。。。程序 = 算法 + 數據結構於是乎,我也開始重視算法和數據結構的重要性了。 那些躺在網盤裡的收藏版,也是時候拿出來曬一曬了。
  • 我們到底該如何學習《數據結構與算法》
    可以看出國內外大廠對於算法與數據結構的看重。第二:工作現在的大廠api框架基本上背後的邏輯就是基於算法實現的。其實算法的種類有很多,比如說機器學習、神經網絡算法,還有java中的排序算法,網際網路的商品推薦、股票預測其背後的邏輯都是算法。就算是熟悉的那些框架,背後的邏輯也是數據結構與算法。
  • mysql 002|order by的排序算法竟然是這樣的!
    拋出本文問題order by 的排序流程是什麼?order by 的排序算法是什麼?order by 的優化點在於什麼?目前進入了排序階段,根據排序列的要求,把排序緩衝區的數據加載進內存進行排序返回客戶端看完了一次排序,或許你對二次排序也有一定的明白了。
  • 5分鐘弄懂的五大常用算法之「分治法」,以C語言歸併排序算法為例
    分治算法,顧名思義就是「分而治之」,即把規模較大的複雜問題拆分為若干規模較小的類似子問題,並逐個解決,最後再將各個子問題的解決結果合併,得到原始問題的結果的方法。這個技巧是很多高效算法的基礎,例如快速排序算法、歸併排序算法、快速傅立葉變換等等。
  • 從力扣 LeetCode 出發,結合教育、評估、培訓打造技術人才職業化新...
    作為一個專業 IT 技術職業化提昇平臺,力扣(LeetCode)為全球程式設計師提供了完善的在線判題服務、學習工具和社區討論、模擬面試等功能,幫助 IT 人才快速提升職業技能,強化自身技術能力。據了解,LeetCode 起源於美國矽谷,是最早的 OJ(Online Judge)平臺之一。
  • 每日一道算法:羅馬數字轉整數
    時間複雜度:O(n)github以後每次題解都會上傳到這個項目LeetCodePHP:https://github.com/zhangdejian/LeetCodePHP題目來源力扣(LeetCode):https://leetcode-cn.com/problems/roman-to-integer/
  • 手敲一遍數據結構和排序算法
    排序算法 性質記憶 冒泡排序 選擇排序 插入排序 快速排序 歸併排序 希爾排序 堆排序數據結構 數組 堆 棧 隊列 鍊表 二叉樹 二叉搜索樹 圖 哈希表搜索 廣度優先搜索 深度優先搜索附件 排序算法代碼點擊
  • 每天一道LeetCode算法題——兩數之和
    說來慚愧,算法書看了不止一本,但是看書的時候書裡的練習都沒有怎麼思考,直接看的參考答案,導致了對算法的研究僅僅停留在了解這種程度,缺乏實戰所以在平時coding中也不會將算法知識代入使用。於是開始了LeetCode刷題之旅~題目描述給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,並返回他們的數組下標。
  • 我把七大JS排序算法做成了可視化!!
    ,從而更加容易理解各種排序的實現過程。前言寫這篇文章是有原因的,偶然我看到了一個Java的50種排序算法的可視化的視頻,但是此視頻卻沒給出具體的實現教程,於是我心裡就想著,我可以用JavaScript + canvas去實現這個酷炫的效果。每種排序算法的動畫效果基本都不一樣哦。
  • YouTube調整搜索排序算法:更側重觀看時長
    網易科技訊  10月14日消息,據國外媒體報導,美國視頻網站YouTube最近宣布,將調整其視頻的搜索排序算法根據調整後的算法,如果一個視頻YouTube用戶觀看時間普遍達三分鐘時間,而另一個類似視頻YouTube用戶打開後普遍觀看幾秒鐘後就關閉,那麼前一個視頻將在搜索結果中獲得更高的排名。YouTube 在其官方博客中表示:「今年3月我們對"推薦視頻(Suggested Videos)"功能進行調整,最近對流量分析工具YouTube Analytics進行完善。