演算法之排序 python初實現

2021-10-02 07:53:30 字數 4255 閱讀 4106

排序演算法

時間複雜度

是否基於比較

冒泡、插入、選擇

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.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺...