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

2021-10-19 21:25:21 字數 3497 閱讀 2068

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[j]

def bubble_sort_2(alist): #優化

"""氣泡排序"""

n = len(alist)

for i in range(n-1): #外層迴圈次數

count = 0

for j in range(n-1-i): #這裡 記得要 -i

if alist[j] > alist[j+1]:

alist[j], alist[j + 1] = alist[j+1], alist[j]

count += 1

if 0 == count:

return

''' 原理: 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾, 以此迴圈'''

def select_sort(alist):

"""選擇排序"""

n = len(alist)

for i in range(n - 1): # 外層迴圈次數

min_ind = i

for j in range(i+1,n):

if alist[min_ind] > alist[j]:

min_ind = j

#找到最小值索引,下面進行交換,這樣i每變化一次就確定乙個數的位置了

#alist[i], alist[min_ind] = alist[min_ind], alist[i] #推薦用下面的

if i != min_ind:

alist[i], alist[min_ind] = alist[min_ind], alist[i]

#理解其思想: i從1開始,i為無序序列 中的第乙個元素索引,i-1為有序序列 中的第最後乙個元素索引

def insert_sort(alist):

"""插入排序"""

n = len(alist)

#從第二個位置,即下標為i的元素開始向前插入

for i in range(1, n):

#從第i個元素開始向前比較,如果小於前乙個元素,交換位置

for j in range(i, 0, -1):

if alist[j] < alist[j-1]:

alist[j], alist[j - 1] = alist[j - 1], alist[j]

# 如果不小於的化,就可以退出本次迴圈, 因為i-1為有序序列的最後乙個元素索引,所以前面都是有序的

else:

break

'''思想:快排是一種分而治之的策略,快排的工作過程其實比較簡單,三步走::1) 選擇基準值 pivot 將陣列分成兩個子陣列:小於基準值的元素和大於基準值的元素。2) 對這兩個子陣列進行快速排序。3) 合併結果'''

def quick_sort_v1(alist):

if len(alist)<2: #遞迴結束條件

return alist

#用分治法解決

pivot = alist[0] #假設陣列的第乙個元素為pivot

less_pivot = [i for i in alist[1:] if i <=pivot]

more_pivot = [i for i in alist[1:] if i > pivot]

return quick_sort_v1(less_pivot) + [pivot] + quick_sort_v1(more_pivot)

#總結:

#第一是它需要額外的儲存空間,不是inplace 原地排序。

#第二是它的 partition 操作每次都要兩次遍歷整個陣列

def quick_sort(alist, start, end):

"""快速排序"""

if start >= end: # 遞迴結束條件

return

pivot = alist[start] # 假設基準值

low = start

high = end

while (low < high):

# 必須 high先左移

while (low < high) and alist[high] >= pivot:

high =high -1

alist[low] = alist[high] # 改變low的值

while (low < high) and alist[low] < pivot:

low =low + 1

alist[high] = alist[low] # 改變high的值

# 從迴圈退出時,low==high, 這樣就找到了pivot應該在的位置

alist[low] = pivot

# 對low左邊的列表執行快速排序

quick_sort(alist, start, low - 1)

# 對low右邊的列表排序

quick_sort(alist, low + 1, end)

'''歸併排序把陣列遞迴成只有單個元素的陣列,之後再不斷兩兩 合併,最後得到乙個有序陣列。1)分解:將待排序的 n 個元素分成各包含 n//2 個元素的子串行2)解決:使用歸併排序遞迴排序兩個子串行3)合併:合併兩個已經排序的子串行以產生已排序的答案'''

def merge(left_li,right_li):

res = #新的已排序好的列表

i, j =0, 0

#對2個列表中的元素 兩兩對比,將較小的追加到res中,並對當前列表下標加1

while( i

if left_li[i] <= right_li[j]:

i += 1

else:

j += 1

#退出迴圈後 至少有1個列表遍歷完了

res += left_li[i:] #a = [1,2,3] ---> a[3:] --->

res += right_li[j:]

return res

def merge_sort(alist):

"""歸併排序"""

n = len(alist)

if n < 2 :

return alist

mid = n // 2

# left 採用歸併排序後形成的有序的新的列表

left_li = merge_sort(alist[:mid])

# right 採用歸併排序後形成的有序的新的列表

right_li = merge_sort(alist[mid:])

#d對排序好的兩個列表合併,產生乙個新的排序好的列表

return merge(left_li, right_li)

python 實現常見排序演算法

coding utf 8 bubble sort 氣泡排序 時間複雜度最壞為o n2 最優的為n import time def bubble sort alist 氣泡排序 param alist return cur 1 while cur len alist 1 and len alist 1...

常見排序演算法Python實現

氣泡排序 最優時間複雜度 o n 最壞時間複雜度 o n 2 穩定性 穩定 def bubble sort alist 氣泡排序 for j in range len alist 1,0,1 count 0 for i in range j if alist i alist i 1 alist i ...

常見排序演算法 python實現

穩定性是指序列中相同的數字在排序後相對位置不發生改變 常見的且穩定的排序演算法有冒泡 歸併 插入,其餘的為非穩定的排序演算法 def bubble sort alist for j in range len alist 1 0,1 for i in range j if alist i alist ...