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

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

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自學之路

點讚是最大的支持

相關焦點

  • 字節大佬Leetcode刷題筆記,看完吊打問你算法的面試官
    第二部分是對於數據結構與算法的總結第三部分是 anki 卡片, 將 leetcode 題目按照一定的方式記錄在 anki 中,方便大家記憶。其中算法,主要是以下幾種:基礎技巧:分治、二分、貪心排序算法:快速排序、歸併排序、計數排序搜索算法:回溯、遞歸、深度優先遍歷
  • 或許是比力扣 leetcode 更好的選擇?推薦兩個編程算法寶藏網站
    本文介紹兩個 OI 專業社區,非常適合系統學習、練習 數據結構算法 思維。我隨意訪問一下,2 hours ago 剛剛 commit 過,倉庫依舊保持更新,活力四射這個項目對自己的定位是:「 OI Wiki 致力於成為一個免費開放且持續更新的知識整合站點,大家可以在這裡獲取關於 編程競賽 (competitive programming) 有趣又實用的知識,我們為大家準備了競賽中的基礎知識、常見題型
  • LeetCode-23.合併K個排序鍊表(Merge k Sorted Lists)
    這是前面Merge Two Sorted Lists的一個follow-up排序超大數量級的數據,可以分成N個機器分別排序
  • 數據結構與算法之拓撲排序
    BFS和DFS總結的一些套路,忽然覺得不如直接拓撲排序講解一下,也是甚好,那麼今天就介紹一下拓撲排序吧。從拓撲排序的定義可以知曉,這一算法的作用是兩個,第一,用來梳理圖頂點的指向順序;第二,可以用來判斷圖是否為有向無環圖(DAG,Directed Acyclic Graph)。此外,拓撲排序並不是一個排序算法,而是給出一個任務執行的線性順序(不唯一)。
  • 【算法總結】五道常見的算法-二叉樹
    有一些讀者反饋說,能不能整理一些面試常見的算法。前段時間,我恰好總結了 LeetCode 常見的面試算法題目。https://github.com/gdutxiaoxu/Android_interview剛開始準備刷算法題目的時候,感覺真的是好難,十道題目有九道是不會的。心中曾一萬隻草泥馬跑過,自己怎麼這麼辣雞。
  • LeetCode 147 | 對鍊表進行插入排序
    插入排序的動畫演示如上。從第一個元素開始,該鍊表可以被認為已經部分排序(用黑色表示)。每次迭代時,從輸入數據中移除一個元素(用紅色表示),並原地將其插入到已排好序的鍊表中。插入排序算法:插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。每次迭代中,插入排序只從輸入數據中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
  • [LeetCode] 912. Sort an Array 數組排序
    ,在平時刷其他題的時候,遇到要排序的時候,一般都會調用系統自帶的排序函數,像 C++ 中直接就調用 sort 函數即可,但是這道題考察的就是排序,再調用系統的排序函數就有些說不過去了。這裡需要自己實現排序功能,常見排序方法有很多,插入排序,選擇排序,堆排序,快速排序,冒泡排序,歸併排序,桶排序等等。它們的時間複雜度不盡相同,這道題貌似對於平方級複雜度的排序方法會超時,所以只能使用那些速度比較快的排序方法啦。
  • leetcode每日一題:49.字母異位詞分組
    leetcode每日一題:49.字母異位詞分組:https://leetcode-cn.com/problems/group-anagrams/一起刷題吧一、題意分析 輸入:由字符串組成的列表(數組)輸出:將由同樣的字母和字母個數組成的不同序列放在一個列表裡,然後整體做為一個列表輸出難度
  • LeetCode-75.顏色分類(Sort Colors)
    顏色分類給定一個包含紅色、白色和藍色,一共 n 個元素的數組,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。注意:不能使用代碼庫中的排序函數來解決這道題。
  • 推薦4個基於 Java語言的開源 Leetcode 題解!算法面試不愁了!
    為了能夠更好地準備算法面試,我們大部分人能做的就是刷 Leetcode 來積累解決算法題的經驗和套路。為了能夠幫助我們更好的刷 Leetcode,Guide 精選了一些不錯的基於 Java 題解的開源項目,文末有項目連結。
  • Leetcode刷題-排序
    本文先介紹幾種常見的排序算法的python實現,接著對幾道涉及排序的leetcode題目進行實踐常見的排序算法冒泡排序進行n(數組長度n)次循環,每次從左向右兩個數依次比較,然後將未排序的最大值移到最右時間複雜度:O(n^2)  空間複雜度
  • JS家的排序算法 十大經典算法排序總結
    它是一本很好的針對前端開發者們的入門算法書籍,可是,它有一個很大的缺陷,就是裡面有很多明顯的小錯誤,明顯到就連我這種半路出家的程序猿都能一眼看出來。還有一個問題是,很多重要的算法和數據結構知識並沒有在這本書裡被提到。這些問題對於作為一個晚期強迫症患者的我來說簡直不能忍。於是乎,一言不合我就決定自己找資料總結算法。那麼,我就從算法領域裡最基礎的知識點——排序算法總結起好了。
  • 算法系列: 10大常見排序算法(3)插入排序
    算法介紹插入排序最好的示例是撲克牌,很多書都以抓撲克牌的過程為例子講述插入的排序過程。現在你需要將手牌從左到右按小到大排序。算法實現沒代碼的算法都是耍流氓因此,直接插入排序的時間複雜度為 O(n^2)。思維導圖系列: 10大最常見排序算法算法系列: 10大常見排序算法(1) 冒泡算法系列: 10大常見排序算法(2) 選擇排序請點擊閱讀原文來觀看動畫交互課件註:部分圖片原型來自網絡。
  • 一個月帶你狂刷算法Leetcode題,衝刺最後秋招!
    可你往往忽略了,他們在面試前2-3個月就開始準備不論是機器學習還是數據分析,面試最常見的考點基本覆蓋SQL、Python、統計學、數學、編程、算法。但這些知識點你不可能在短時間內學完所有不僅如此,面試官在考察我們面試的時候經常會非常注重知識點細節,有時候一個問題都會追問到底到底應該如何快速突擊?
  • 程式設計師必備的幾種常見排序算法和搜索算法總結
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言最近為了鞏固一下自己的算法基礎,又把算法書裡的基本算法刷了一遍, 特地總結一下前端工程師需要了解的排序算法和搜索算法知識,雖然還有很多高深算法需要了解
  • 排序算法總結(1):冒泡排序
    冒泡排序是一種交換排序。什麼是交換排序呢?交換排序:兩兩比較待排序的關鍵字,並交換不滿足次序要求的那對數,直到整個表都滿足次序要求為止。算法思想它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。
  • 數據結構常見的八大排序算法
    八大排序,三大查找是《數據結構》當中非常基礎的知識點,在這裡為了複習順帶總結了一下常見的八種排序算法。
  • 微信大佬總結的算法學習經驗
    目前國內大廠的算法考察,基本不會超過leetcode 中等難度,上限難度基本都是leetcode 中等題裡面的中等難度(有點拗口,leetcode 中等難度裡面也有分檔次)。如果你能夠再20分鐘內,做出這種難度的題目,國內大廠的算法面試,基本可以暢通無阻。
  • 算法系列: 10大常見排序算法: 快速排序法
    快速排序法(Quick Sort)是劍橋大學教授在讀大學時發明的排序算法,也是當今使用最廣泛的高效排序算法之一。QuickSort思路直觀而精巧,值得我們反覆吟唱17現在位於數組的第5位,也是整個數組排序後的最終位置:
  • LeetCode-15.三數之和(3Sum)
    示例:給定數組 nums = [-1, 0, 1, 2, -1, -4],滿足要求的三元組集合為:[ [-1, 0, 1], [-1, -1, 2]]來源:力扣(LeetCode)連結:https://leetcode-cn.com/problems/3sum/Link:https:/