****
之後就重點說一下堆排序和快排的選擇問題
各種常用排序演算法
類別排序方法
時間複雜度
空間複雜度
穩定性複雜性
特點最好
平均最壞
輔助儲存
簡單插入
排序直接插入
o(n)
o(n2)
o(n2)
o(1)
穩定簡單
希爾排序
o(n)
o(n1.3)
o(n2)
o(1)
不穩定複雜
選擇排序
直接選擇
o(n)
o(n2)
o(n2)
o(1)
不穩定堆排序
o(n*log2n)
o(n*log2n)
o(n*log2n)
o(1)
不穩定複雜
交換 排序
氣泡排序
o(n)
o(n2)
o(n2)
o(1) 穩定
簡單1、氣泡排序是一種用時間換空間的排序方法,n小時好
2、最壞情況是把順序的排列變成逆序,或者把逆序的數列變成順序,最差時間複雜度o(n^2)只是表示其操作次數的數量級
3、最好的情況是資料本來就有序,複雜度為o(n)
快速排序
o(n*log2n)
o(n*log2n)
o(n2)
o(log2n)~o(n)
不穩定 複雜
1、n大時好,快速排序比較占用記憶體,記憶體隨n的增大而增大,但卻是效率高不穩定的排序演算法。
2、劃分之後一邊是乙個,一邊是n-1個,
這種極端情況的時間複雜度就是o(n^2)
3、最好的情況是每次都能均勻的劃分序列,o(n*log2n)
歸併排序
o(n*log2n)
o(n*log2n)
o(n*log2n)
o(n) 穩定
複雜1、n大時好,歸併比較占用記憶體,記憶體隨n的增大而增大,但卻是效率高且穩定的排序演算法。
基數排序
o(d(r+n))
o(d(r+n))
o(d(r+n))
o(rd+n)
穩定複雜
注:r代表關鍵字基數,d代表長度,n代表關鍵字個數
大家可以看到,堆排序的時間複雜度是很穩定的,而快排的時間複雜度最壞情況下會到n^2,那麼為什麼不都用堆排序呢?
首先,時間複雜度這個概念只是乙個粗略的估計概念,在真實情況下, 一般快排的效率比堆排序高很多。
快排:陣列中交換資料,在資料量不是特別大,而且離散程度較高的情況下效率很高
堆排序:建立堆,資料交換,調整堆的時間均很多
所以在實際應用中,我們用快排會更多一點。
堆排序的典型應用:在100萬個數字中找出最大的100個這種問題,構建乙個小頂堆然後遍歷調整就可以了
為什麼是小頂堆:小頂堆,最小的數就在最上面,只要與最上面的數進行比較就可以了,所以是小頂
演算法基礎 快排 歸併 堆排序比較
1 快速排序,上 def quicksort arr if len arr 1 return arr v arr 0 high i for i in arr 1 if i v low i for i in arr 1 if ireturn quicksort low v quicksort high...
快排 堆排序
快速排序主要運用了二分的思想,每次選擇乙個基準元素,比基準元素打的元素都放在基準元素前面,比基準元素小的元素都放在基準元素後面,這樣不斷遞迴細分,完成排序。void quicksort int a,int l,int r if ia i a j i while ia i temp if ia j a...
快排 堆排序
荷蘭國旗問題 經典快排 改進快排 隨機快排 堆結構 from左神演算法初級班第二節 問題一 給定乙個陣列arr,和乙個數num,請把小於等於num的數放在數 組的左邊,大於num的數放在陣列的右邊。要求額外空間複雜度o 1 時間複雜度o n 問題二 荷蘭國旗問題 給定乙個陣列arr,和乙個數num,...