9个元素换6次达到排序序列_十大算法排序(Sorting Algorithm) Study notes
(自己手打的python實現代碼以及整理的各路大神總結的知識點)
自用學習筆記,由于基于北美cs學習,文章大量中英混雜(謹慎食用)
十大排序算法:
插入排序
1)Insertion Sort 簡單插入排序:
2)Shell sort(希爾排序):突破n^2
交換排序
3)Bubble sort:兩兩比較
4)Quicksort
選擇排序
5)Selection Sort選擇排序:選出最小的
6)Heap sort (堆排序,二叉樹的代言人):
穩定的nlog,平常一般不用,常數太大
歸并排序
7)Merge sort(分治DC的典型代表)
非比較類排序:
8)Counting sort 計數排序:平凡的線性counting/排序
9)Radix Sort 基數排序
10)Bucket Sort 桶排序
Time complexity vs Space Complexity
常見的 time complexity 復雜度量級(從快到慢)
- O(1)【無論代碼多長,只要沒有循環】
- O(logN)【ie. for i<n, i=i*2 等價于共循環x次,且2^x =n】
- O(n)【for里循環n遍】
- O(nlogN)【在2)的基礎上循環n遍】
- O(n^2)【把O(n)再嵌套循環一次】
- O(n^3)
- O(n^k)
- O(2^n)【ie. T(0) = T(1) = 1,同時 T(n) = T(n - 1) + T(n - 2) + 1,斐波那契數列(Fibonacci sequence)通過歸納證明法可以證明,當 n >= 1 時 T(n) < (5/3)^n,同時當 n > 4 時 T(n) >= (3/2)^n。所以可以表示為 O((5/3)^n),簡化后為 O(2^n)。】
2.空間復雜度:算法運行過程中臨時占用內存儲蓄空間大小的一個度量
3.穩定:如果a=b,a原本在b前面,排序之后a仍然在b的前面。
4.不穩定:如果a=b,a原本在b的前面,排序之后 a 可能會出現在 b 的后面
1.插入排序
1)Insertion Sort:簡單插入排序
idea: 模擬撲克牌理牌的歸類思路
時間復雜度:
- 平均:O(n^2) (每輪操作O(n)次,共O(n)輪)
- worst:O(n^2)
- best: O(n)
穩定性:穩定
適用于: 處理數據量比較少且基本有序的數據
process: 從第二個元素開始,與左邊的第一個元素比較,如果比#1元素小,則插在#1的左邊;如果比#1元素大,則無需移動,直接進行到#3開始比較,此時前面有兩個元素,從最靠近的開始比較,如果比誰大就插入在誰的右邊
python 實現代碼如下:
2)Shell Sort 希爾排序
idea:插入排序的改進版,把較大的數據集合邏輯上分割(并沒有實際分組操作)成若干個小組,然后對每個小組分別進行插入排序,即多了一個增量(gap)以及增量序列
適用于:中等規模數據
穩定性: 不穩定
時間復雜度:
- 平均: O(n^1.3)
- worst:O(n^2) 增量序列為 {1,2,4,8.....}
- best:O(n)
python 實現代碼如下:
process:增量的存在是將index相差增量的分到一組
比如arr :5,7,8,3,1,2,4,6
[index: 0,1,2,3,4,5,6,7]
length = 8, 這個的gap = 4,
此時a[0],a[4]一組,a[1],a[5]一組,...每個組進行insertion sort
for i in range(gap, n) - for i in range(4, 8):選定index為4,5,6,7的數
lst[i - gap]: index4,5,6,7的分別對應index0,1,2,3
如果index在前面的value大,就換位置,這一輪排序完為
1,2,4,3,5,7,8,6
然后繼續縮小增量
第二輪的增量為 gap//=2 為2, 則又變遍歷一次for i in range(gap, n) - for i in range(2, 8)
此時為a[0],a[2],a[4],a[6]一組,a[1],a[3],a[5],a[7]一組,每個組進行insertion sort
lst[i - gap] > lst[i]:a[0]先和a[2]比,
- 如果a[2]比a[0]大則跳出while 繼續遍歷for:開始a[1]和a[3]比,a[2]和a[4]比....(每輪每個組輪流來一個,不是先完成一個組再進行另一個組
- 如果a[0]比a[2]大則交換,i -=gap 的存在原理即為insertion sorting:在本組內,和前面所有元素比,以保證這個元素比左邊的所有元素大,則跳出while繼續for
直到 i - gap <0 停止(因為是從index大的順著gap找index小的對應,如果i-dex小于0則表示已經遍歷所有了
其他代碼實現詳情可見https://mp.weixin.qq.com/s/4kJdzLB7qO1sES2FEW0Low
交換排序
1. Bubble sort
- idea: 比較相鄰的元素,如果前面的大則交換;針對所有元素重復上述步驟,除了最后一個。即對n個數據操作n-1輪,每輪找出一個最大值(會被移到最后面)
- 時間復雜度:O(n^2)【(n-1)+(n-2)+....+1= n(n-1)/2,等差數列求和,去掉常數系數】(平均=worst), O(n) (best)
- 穩定性:穩定
- python 代碼實現:
2. Quick Sort
idea: 選擇一個數作為pivot,把小于這個數的放在左邊,大于這個數的放在右邊,然后再繼續進行分割(partition)和遞歸(recurision)
時間復雜度:
- O( n N)(平均&Best)
- O(n^2) worst
穩定性:不穩定
python 代碼實現:
未完待續。。
總結
以上是生活随笔為你收集整理的9个元素换6次达到排序序列_十大算法排序(Sorting Algorithm) Study notes的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么qt这么强大没人使用_就是这么强大
- 下一篇: python代码运行演示-Python代