各種排序整理詳解


diary

11.04
1.馬上就要期中考了,現在什么也沒復習,慌成dog
2.從語文老師口中知道,班主任一直很關心我的學科成績(特別是Chinese,非常感動(≧▽≦)/啦啦啦)

11.16
1.換了新同桌,卡星
2.跟新同桌說獎勵他一個大筆豆子,他欣然答應,最后一下“啪”的清脆和紅紅的臉,就不必我多說了
3.跟同學討論—— ——在人死之前打了別人一下是不是血賺

11.23
1.自認為自己的性格不太好,喜歡講話,之后要改
2.遇到一個豪華綠鑽的QQ音樂用戶,就用他/她的賬號把自己的歌單下完了

11.28
1.最近發現了一個新game,哎了哎了

讓我們進入今天的正題

目錄

  • \(冒泡排序(Bubble Sort)\)
  • \(插入排序(Insertion Sort)\)
  • \(希爾排序(Shell Sort)\)
  • \(選擇排序(Selection Sort)\)
  • \(快速排序(Quick Sort)\)
  • \(歸並排序(Merge Sort)\)
  • \(堆排序(Heap Sort)\)
  • \(計數排序(Counting Sort)\)
  • \(桶排序(Bucket Sort)\)
  • \(基數排序(Radix Sort)\)

一.冒泡排序

冒泡排序是一種交換排序,核心是冒泡,把數組中最小的那個往上冒,冒的過程就是和他相鄰的元素交換。

重復走訪要排序的數列,通過兩兩比較相鄰記錄的排序碼。
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。

持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

性能分析

穩定性:穩定
平均時間復雜度:\(O(N^2)\)
最佳時間復雜度:\(O(N)\)
最差時間復雜度:\(O(N^2)\)

模擬過程

二.插入排序

插入排序操作類似於摸牌並將其從大到小排列。每次摸到一張牌后,根據其點數插入到確切位置。

① 從第一個元素開始,該元素可以認為已經被排序
② 取出下一個元素,在已經排序的元素序列中從后向前掃描
③如果該元素(已排序)大於新元素,將該元素移到下一位置
④ 重復步驟③,直到找到已排序的元素小於或者等於新元素的位置
⑤將新元素插入到該位置后
⑥ 重復步驟②~⑤

性能分析

穩定性:穩定
最差時間復雜度:\(O(N^2)\)
平均時間復雜度:\(O(N^2)\)

模擬過程

三.希爾排序

希爾排序的實質就是分組插入排序,該方法又稱遞減增量排序算法,因Donald Shell(希爾)於1959年提出而得名。希爾排序是非穩定的排序算法。

① 先取一個小於n的整數d1作為第一個增量,把文件的全部記錄分成d1個組。
② 所有距離為d1的倍數的記錄放在同一個組中,在各組內進行直接插入排序。
③ 取第二個增量d2小於d1重復上述的分組和排序,直至所取的增量dt=1(dt小於dt-l小於…小於d2小於d1),即所有記錄放在同一組中進行直接插入排序為止。

性能分析

穩定性:不穩定
最差時間復雜度:\(O(N^2)\)
平均時間復雜度:\(O(Nlog_2N)\)

模擬過程

假設有一組{9, 1, 2, 5, 7, 4, 8, 6, 3, 5}無需序列。

第一趟排序: 設 gap1 = N / 2 = 5,即相隔距離為 5 的元素組成一組,可以分為 5 組。接下來,按照直接插入排序的方法對每個組進行排序。
第二趟排序:
將上次的 gap 縮小一半,即 gap2 = gap1 / 2 = 2 (取整數)。這樣每相隔距離為 2 的元素組成一組,可以分為2組。按照直接插入排序的方法對每個組進行排序。
第三趟排序:
再次把 gap 縮小一半,即gap3 = gap2 / 2 = 1。 這樣相隔距離為1的元素組成一組,即只有一組。按照直接插入排序的方法對每個組進行排序。此時,排序已經結束。

四.選擇排序

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

選擇排序的思想其實和冒泡排序有點類似,都是在一次排序后把最小的元素放到最前面,或者將最大值放在最后面。但是過程不同,冒泡排序是通過相鄰的比較和交換。而選擇排序是通過對整體的選擇,每一趟從前往后查找出無序區最小值,將最小值交換至無序區最前面的位置。

① 第一輪從下標為 1 到下標為 n-1 的元素中選取最小值,若小於第一個數,則交換
② 第二輪從下標為 2 到下標為 n-1 的元素中選取最小值,若小於第二個數,則交換
③ 依次類推下去……

性能分析

穩定性:不穩定
平均時間復雜度:O(N^2)
最佳時間復雜度:O(N^2)
最差時間復雜度:O(N^2)

模擬過程

五.快速排序

有二分思想

  • 選擇A中的任意一個元素pivot(選哪個點都行,推薦選中間因為舒服,但個人喜歡坐着選),該元素作為基准
  • 將小於基准的元素移到左邊,大於基准的元素移到右邊(分區操作)
  • A被pivot分為兩部分L 和 R,繼續對L和R做同樣的處理
  • 直到所有子集元素不再需要進行上述步驟

性能分析

穩定性:不穩定
平均時間復雜度:O(NlogN)
最佳時間復雜度:O(NlogN)
最差時間復雜度:O(N^2)

模擬過程

六.歸並排序

歸並排序是用分治思想,分治模式在每一層遞歸上有三個步驟:

  • 分解(Divide):將n個元素分成個含n/2個元素的子序列。
  • 解決(Conquer):用合並排序法對兩個子序列遞歸的排序。
  • 合並(Combine):合並兩個已排序的子序列已得到排序結果。

1.遞歸分解,將數組分解成left和right。如果這兩個數組內部數據是無序的,則對數組進行二分,直至分解出的小組只有一個元素,此時認為該小組內部有序。
2.合並兩個有序數組,比較兩個數組的最前面的數,誰小就先取誰,該數組的指針往后移一位。
3.重復步驟2,直至一個數組為空。
4.最后把另一個數組的剩余部分復制過來即可。

性能分析

穩定性:穩定
平均時間復雜度:O(NlogN)
最佳時間復雜度:O(N)
最差時間復雜度:O(NlogN)

模擬過程

七.堆排序

雖然STL大法好,但是還是要寫一下的(兢兢業業的博主不多了)
1.將數據存起來建一個大根堆
2.將堆頂與末尾交換,並輸出(相當於不要了),再用剩下的點建一個大根堆
3.直至變成小根堆為止

性能分析

穩定性:不穩定
平均時間復雜度:O(nlogn)
最佳時間復雜度:O(nlogn)
最差時間復雜度:O(nlogn)

Why not 模擬過程?

because it is too easy to see(mainly is that I can't insert mp4)

But I can give a website
模擬過程

八.計數排序

計數排序(Counting sort)是一種穩定的線性時間排序算法。

注意:不是桶排序

① 分配。掃描一遍原始數組,以數值作為下標,將該下標的計數器增1。
② 收集。掃描一遍計數器數組,按順序把值收集起來。

性能分析

穩定性:穩定
平均時間復雜度:O(n + k)
最佳時間復雜度:O(n + k)
最差時間復雜度:O(n + k)
空間復雜度:O(n + k)

模擬過程

九.桶排序

一句話總結:划分多個范圍相同的區間,每個子區間自排序,最后合並。

桶排序是計數排序的擴展版本,計數排序可以看成每個桶只存儲相同元素,而桶排序每個桶存儲一定范圍的元素,通過映射函數,將待排序數組中的元素映射到各個對應的桶中,對每個桶中的元素進行排序,最后將非空桶中的元素逐個放入原序列中。

桶排序需要盡量保證元素分散均勻,否則當所有數據集中在同一個桶中時,桶排序失效。

性能分析

穩定性:穩定
平均時間復雜度:O(n + k)
最佳時間復雜度:O(n + k)
最差時間復雜度:O(n ^ 2)
空間復雜度:O(n * k)

模擬無過程,只有圖(嘻!)

十.基數排序

基數排序\((Radix Sort)\)是桶排序的擴展,它的基本思想是:將整數按位數切割成不同的數字,然后按每個位數分別比較。

具體做法是:將所有待比較數值統一為同樣的數位長度,數位較短的數前面補零。然后,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以后, 數列就變成一個有序序列。

性能分析

穩定性:穩定
時間復雜度:O(k*N)
空間復雜度:O(k + N)

模擬過程

Last(結束)

總共十個排序,制作不易,跪求點個贊,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM