排序算法雖然在平常的工作中也許用不到,但是對於加強自身的邏輯思維能力以及加深對數據結構的理解有不錯的效果。下面是用python3實現的部分排序算法。
1.冒泡排序法
冒泡排序的基本思想是將相鄰的元素進行比較,如果是從小到大排序的話,則將小的元素放在左邊,這種排序的思想很像水中的氣泡上浮,所以稱爲冒泡排序。
def bubble_sort(alist):
"""冒泡排序"""
n = len(alist)
# 2. 控制遍歷的次數
for j in range(n-1): # 1
# 1. 先控制角標 i 的變化
exchange = False
for i in range(0,n - 1 - j):
# 判斷角標 i 和 i+1對應的值的大小
if alist[i] > alist[i+1]:
# 交換
alist[i],alist[i+1] = alist[i+1],alist[i]
exchange = True
if not exchange:
break
選擇排序的基本思想是從無序序列中遍歷出最小的元素,放在序列的第一個位置,即下標爲0的位置,然後再次遍歷,從剩下的元素中再次找到最小的元素,放在下標爲1的位置,依次類推,最終完成排序。
def select_sort(alist):
"""選擇排序"""
n = len(alist)
# 控制比較的次數
for j in range(n-1):
# 控制角標
min_index = j
for i in range(1+j,n):
# 比較
if alist[i] < alist[min_index]:
# 修改 min_index 對應的值
min_index = i
if min_index != j:
# 交換
alist[min_index],alist[j] = alist[j],alist[min_index]
3.插入排序
插入排序的基本思想是將一個序列看成兩部分:左邊的部分是有序序列,右邊的是待排序序列。每次分別比較有序和待排序序列元素的大小,然後插入到合適位置,完成排序。
def insert_sort(alist):
"""插入排序"""
n = len(alist)
for j in range(1,n):
for i in range(j,0,-1):
if alist[i] < alist[i - 1]:
# 交換
alist[i],alist[i-1] = alist[i-1],alist[i]
else:
break
希爾排序實際上是對插入排序的一個優化排序算法,先通過將源序列按某個下標增量分割成若干子序列,分別進行插入排序,然後讓下標增量遞減,每個子序列中的關鍵字就會增加,當增量遞減爲1時,再進行一次插入排序,完成了排序。
def shell_sort(alist):
n = len(alist)
# 控制增量的變化
gap = n // 2
while gap >= 1:
# shell 排序是對於插入排序的優化
for i in range(gap, n):
while (i - gap) >= 0:
if alist[i] < alist[i - gap]:
# 交換
alist[i], alist[i - gap] = alist[i - gap], alist[i]
# 交換完畢之後就應該修改 i
i = i - gap
else:
break
gap = gap // 2
快速排序的基本思想是取序列中的一個元素作爲"基準",然後將比該"基準"小的元素放在它左邊,將比它大的元素放在右邊,和它相等的元素放在任意一邊均可,想放哪邊全由編寫代碼時決定,然後通過遞歸調用,對兩邊的序列分別排序,最終變成有序序列。
ef quick_sort(alist,start,end):
# 自己的調用自己,退出遞歸的條件 maximum recursion depth exceeded in comparison
if start > end:
# 結束遞歸
return
n = len(alist)
left = start
right = end
base_value = alist[left]
while left < right:
# = 添加任何一個判斷都可以,但是 '=' 決定了相同的基準值應該放在哪一邊
while left < right and alist[right] >= base_value:
right -= 1
# 退出循環 將 right 角標對應的值設置給 left 角標
alist[left] = alist[right]
while left < right and alist[left] < base_value:
left += 1
# 將 left 角標對應的值設置給 right 角標
alist[right] = alist[left]
# 退出循環 left = right
alist[left] = base_value
# 遞歸調用
# quick_sort(alist[:left])
# quick_sort(alist[left+1:])
# 先對於左變的序列完成快速排序
quick_sort(alist,start,left-1)
quick_sort(alist,left + 1,end)
以上就是本次博客的全部內容了,由於是初次寫博客,多多包涵,有不正確的地方還請指正。