排序演算法
時間複雜度
是否基於比較
冒泡、插入、選擇
o (n
2)
o(n^2)
o(n2
)true
快排、歸併
o (n
log(
n)
)o(nlog(n))
o(nlog
(n))
true
桶、計數、基數
o (n
)o(n)
o(n)
false
question:插入排序和氣泡排序的時間複雜度都是o(n
2)
o(n^2)
o(n2
),但實際開發中為什麼更傾向於使用插入排序而不是氣泡排序?
氣泡排序每次交換需要三次賦值操作,而插入排序只用一次。分析乙個演算法要從哪些方面入手呢?
1.最好最壞平均情況時間複雜度排序演算法的記憶體消耗:2.時間複雜度的係數、常數、低階
3.比較次數和交換(移動)次數
原地排序:特指空間複雜度是o(1)的排序演算法。排序演算法的穩定性:
待排序的序列中存在值相等的元素,經過排序後相等元素之間原有的先後順序不變。
'''氣泡排序'''
defbubble_sort
(int_arr)
: n=
len(int_arr)
if(n<=1)
:return int_arr
while
(n>0)
: i=
0 flag=
false
while
(i:if
(int_arr[i]
>int_arr[i+1]
):temp=int_arr[i]
int_arr[i]
=int_arr[i+1]
int_arr[i+1]
=temp
flag=
true
i+=1if
(flag==
false):
break
n-=1return int_arr
'''插入排序'''
definsertion_sort
(int_arr)
: n=
len(int_arr)
if(n<=1)
:return int_arr
i=1while
(i: j=i-
1 value=int_arr[i]
while
(j>=0)
:if(valueint_arr[j+1]
=int_arr[j]
j-=1else
:break
int_arr[j+1]
=value
i+=1return int_arr
'''選擇排序'''
defselection_sort
(int_arr)
: n=
len(int_arr)
if(n<=1)
:return int_arr
i=0while
(i: value = i
j=i+
1while
(j(int_arr[j]
value=j
j+=1 temp=int_arr[i]
int_arr[i]
=int_arr[value]
int_arr[value]
=temp
i+=1return int_arr
先把乙個陣列從中間分成前後兩部分,然後對前後兩部分分別排序,再將排好序的兩部分合併在一起,然後整個陣列就有序了。歸併排序使用的是分治思想。分治是一種解決問題的處理思想,遞迴式一種程式設計技巧。
歸併遞推公式:merge_sort(p…r) = merge(merge_sort(p…q) , merge_sort(q+1,r))
'''歸併排序'''
defmerge
(int_arr_1, int_arr_2)
: n1=
len(int_arr_1)
if(n1<1)
:return int_arr_2
n2=len(int_arr_2)
if(n2<1)
:return int_arr_1
int_arr=
i=0 j=
0while
(i(int_arr_1[i]
) i +=
1else:)
j +=
1while
(ii +=
1while
(j < n2):)
j +=
1return int_arr
defmerge_sort
(int_arr)
: n=
len(int_arr)
if(n<=1)
:return int_arr
'''//除取整'''
middle=n//
2 left= merge_sort(int_arr[
:middle]
) right=merge_sort(int_arr[middle:])
return merge(left,right)
快排:選任意乙個資料作為pivot(分割槽點),將資料分為三部分,直到有序。快速排序遞推公式:quick_sort(p…r) = quick_sort(p…q-1) + quick_sort(q+1…r)
'''快速排序'''
defquick_sort
(int_arr,start,end)
: left=start
right=end
if(left>=right)
:return int_arr
key=int_arr[left]
while
(left < right)
:while
(left < right)
and(int_arr[right]
>= key)
: right -=
1 int_arr[left]
=int_arr[right]
while
(left < right)
and(int_arr[left]
<= key)
: left +=
1 int_arr[right]
=int_arr[left]
int_arr[left]
=key
quick_sort(int_arr,start,left-1)
quick_sort(int_arr,left+
1,end)
線性排序的時間複雜度是線性的。包括:桶排序、計數排序、基數排序桶排序:將要排序的資料分到幾個有序的桶中,再對桶中的資料進行排序,最後依次取出,結果就是有序的了。
桶排序比較適用於外部排序中。所謂的外部排序就是資料儲存在外部磁碟中,資料量較大,記憶體有限,無法將資料全部載入到記憶體中。
計數排序:可看作是桶排序的一種特殊情況。當要排序的n個資料所處的範圍並不大的時候。例如最大值是k,可以把資料劃分為k個桶,這樣就可以省略桶內排序的時間。
基數排序:如給手機號按大小排序。先根據最後一位排序,在根據倒數第二位,經過十一次排序後就是有序的了。例二:給不同單詞排序。可以給單詞末位補0。
python之希爾排序演算法實現
usr bin env python coding utf 8 author richard kong 希爾排序 shell sort 是插入排序的一種,也稱為縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非常穩定的排序演算法 希爾排序是把記錄按下錶的一定增量分組,對每組使用直...
常見排序演算法之python實現
氣泡排序 英語 bubble sort 是一種簡單的排序演算法。它重複地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍歷數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。思路 比較相...
排序演算法之快速排序的python實現
通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序。快速排序演算法的工作原理如下 1.從數列中挑出乙個元素,稱為 基準 pivot 2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺...