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