python 常用排序演算法

2022-07-20 07:48:15 字數 4286 閱讀 7011

**:

**:常用的排序演算法:氣泡排序,插入排序,歸併排序, 快速排序、基數排序、堆排序,直接選擇排序。

常用的查詢演算法:順序查詢,二分查詢,雜湊表查詢和二叉樹查詢

其中我們應該重點掌握二分查詢、歸併排序和快速排序,保證能隨時正確、完整地寫出它們的**。同時對其他的查詢和排序必須能準確說出它們的特點、對其平均時間複雜度、最差時間複雜度、額外空間消耗和穩定性爛熟於胸.

排序演算法的穩定性:假設在待排序的記錄序列中,存在多個具有相同關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變。即在原序列中r[i]=r[j] r[i]=r[j]r[i]=r[j], 且r[i] r[i]r[i]在r[j] r[j]r[j]之前,而在排序後的序列中,r[i] r[i]r[i]仍在r[j] r[j]r[j]之前,則稱這種排序演算法是穩定的;否則是不穩定的

演算法效能總覽

備註:在pascal中比較容易理解,容易計算的方法是:看看有幾重for迴圈,只有一重則時間複雜度為o(n),二重則為o(n^2),依此類推,如果有二分則為o(logn),二分例如快速冪、二分查詢,如果乙個for迴圈套乙個二分,那麼時間複雜度則為o(nlogn)。

氣泡排序

演算法描述:

1. 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。

2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。

3. 針對所有的元素重複以上的步驟,除了最後乙個

4. 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較

插入排序

def insert_sort2(ilist):

for i in range(len(ilist)):

for j in range(i):

if ilist[i] < ilist[j]:

ilist.insert(j, ilist.pop(i))

break

return ilist

list=[4,6,2,8,3,7]

print insert_sort(list)

list=[6,5,9,8,7,6]

print insert_sort(list)

歸併排序

快速排序

快速排序(quicksort),在平均狀況下,排序 n n 個專案要 o(nlogn) o(nlog⁡n))次比較。在最壞狀況下則需要 o(n 2 ) o(n2))}次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 o(nlogn) o(nlog⁡n) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出

演算法描述:

快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)

1. 從數列中挑出乙個元素,稱為」基準」(pivot)

2. 重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(相同的數可以到任何一邊)。在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作

3. 遞迴地(recursively)把小於基準值元素的子數列和大於基準值元素的子數列排序

#

coding=utf-8

'''快速排序(quicksort),在平均狀況下,排序 n n 個專案要 o(nlogn) o(nlog⁡n))次比較。在最壞狀況下則需要 o(n 2 ) o(n2))}次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 o(nlogn) o(nlog⁡n) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出

演算法描述:

快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)

1. 從數列中挑出乙個元素,稱為」基準」(pivot)

2. 重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(相同的數可以到任何一邊)。在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作

3. 遞迴地(recursively)把小於基準值元素的子數列和大於基準值元素的子數列排序

---------------------

原文:

'''def

quick_sort(list):

if list==:

return

else

: qfirst=list[0]

qless = quick_sort([l for l in list[1:] if l

qmore = quick_sort([m for m in list[1:] if m >qfirst])

return qless+[qfirst]+qmore

defquick_sort2(array, l, r):

if l

q =partition(array, l, r)

quick_sort2(array, l, q - 1)

quick_sort2(array, q + 1, r)

defpartition(array, l, r):

x =array[r]

i = l - 1

for j in

range(l, r):

if array[j] <=x:

i += 1array[i], array[j] =array[j], array[i]

array[i + 1], array[r] = array[r], array[i+1]

return i + 1list=[4,6,2,8,3,7]

print quick_sort2(list,0,5)

5、歸併排序

#

coding=utf-8

'''歸併排序(mergesort),是建立在歸併操作上的一種有效的排序演算法,效率為 o(nlogn) o(nlog⁡n)。2023年由約翰·馮·諾伊曼首次提出。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用,且各層分治遞迴可以同時進行

演算法描述

迭代法

1. 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列

2. 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置

3. 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置

4. 重複步驟3直到某一指標到達序列尾

5. 將另一串行剩下的所有元素直接複製到合併序列尾

遞迴法

1. 將序列每相鄰兩個數字進行歸併操作,形成 ceil(n/2) ceil(n/2) 個序列,排序後每個序列包含兩/乙個元素

2. 若此時序列數不是1個則將上述序列再次歸併,形成 ceil(n/4) ceil(n/4) 個序列,每個序列包含四/三個元素

3. 重複步驟2,直到所有元素排序完畢,即序列數為1

---------------------

原文:

'''def

mergesort(arr):

import

math

if(len(arr)<2):

return

arr

#middle = math.floor(len(arr)/2)

middle = len(arr)/2left, right =arr[0:middle], arr[middle:]

return

merge(mergesort(left), mergesort(right))

defmerge(left,right):

result =

while left and

right:

if left[0] <=right[0]:

else

:

while

left:

while

right:

return

result

list=[4,6,2,8,3,7]

print

mergesort(list)

list=[6,5,9,8,7,6]

print mergesort(list)

python常見排序演算法 python常用排序演算法

def bubble sort alist 氣泡排序 n len alist for i in range n 1 外層迴圈次數 for j in range n 1 i 這裡 記得要 i if alist j alist j 1 alist j alist j 1 alist j 1 alist ...

python實現常用排序演算法

半夜醒來,閒來無事,寫寫排序演算法,興之所致,未來得及debug,有問題自己解決。coding utf 8 created on tue may 19 00 52 47 2015 氣泡排序 插入排序 1 每一步就像在一首已經排序的撲克牌中再插入一張牌,這張牌標記為value 2 從最後一張開始比較,...

常用排序基礎演算法 python

基本思想 兩個數比較大小,較大的數下沉,較小的數冒起來。過程 平均時間複雜度 o n2 引用from random import randint defbubble sort arr,order true 氣泡排序演算法 param arr 需要排序的陣列 param order 排序方向預設為tr...