2.1簡單排序演算法
# 插入排序
#模擬打牌的時候手牌的插入排序
a=[1,4,6,3,7,8,9,543,2,6,78,90,54]
for j in range(1,len(a)):
key=a[j]
i=j-1
while (i>=0 and a[i]>key):
a[i+1]=a[i]
i=i-1
a[i+1]=key
print (a)
#選擇排序
# 選擇演算法
#找出a中最小的數,與a中第乙個數交換,然後找出第二小的數,與a中第二個數交換
a=[124,4,6,3,7,8,9,543,2,6,78,90,54]
for i in range(0,len(a)):
key=a[i]
for j in range(i+1,len(a)):
if a[j]#氣泡排序演算法
沉底排序與選擇排序不同的是,選擇排序是找出最小值,沉底排序是一次交換相鄰的元素,使得最小值沉入列表底端。
# 沉底排序
#i固定時,a[i]中始終儲存較小的數值,第一輪比較完a[0]中為最小值2,
#以此類推,a[1]中為次小值
a=[124,4,6,3,7,8,9,543,2,6,78,90,54]
for i in range(0,len(a)):
for j in range(i+1,len(a)):
if a[j]氣泡排序演算法過程:交換相鄰的元素,使得右邊的元素始終比左邊大,第一輪比較完,最小的數2沉底,較大的數浮上來,以此類推,每一輪結束,都有乙個極小值沉底,相應的大值浮上來,最後一輪,最大值在頂層。故命名為冒泡法。
2.2 分治法(類似遞迴法)
將原問題分解為幾個規模較小但類似於原問題的子問題,遞迴的求解這些子問題,
然後再合併這些子問題的解來建立原問題的解。
import math
def merge(left, right):#兩組序列的排序合併
result =
i = 0
j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
i += 1
else:
j += 1
result += left[i:]
result += right[j:]
return result
def mergesort(seq): #拆分序列
if len(seq) <= 1:
return seq
mid =math.floor(len(seq)/2)
left = mergesort(seq[:mid])
right = mergesort(seq[mid:])
return merge(left, right)
seq=[124,4,6,3,7,8,9,543,2,6,78,90,54]
print ('原序列:',seq)
result = mergesort(seq)
print ('排序後序列:',result)
遞迴問題的最重要的一點是:註明遞迴結束出口,這裡設定到如果列表中只有乙個元素時,返回該元素。
通過pycharm除錯,mergesort函式將列表拆分到只有乙個元素的時候,開始進行兩個元素的歸併工作,其次類推,隨後進行兩組列表的歸併工作。
演算法導論(第三版)第二章,機械工業出版社
演算法導論 python實踐(6 堆排序)
簡單來講就是將陣列按照完全二叉樹的形式排列。葉節點的元素個數最多為2 n 1 次方,其中n為堆高度。最大堆 某一根葉節點的元素小於等於根節點的數值。通常用於排序 最小堆 某一根葉節點的元素大於等於根節點的數值。通常用於構造優先佇列 首先建立最大堆 函式輸入引數為乙個序列和序列的某一下標。對於某一下標...
演算法導論學習2
一般的,對於演算法來說,重點關注的是對演算法的時間和空間度量,也就是時間複雜度和空間複雜度。演算法所需要的時間與輸入的規模同步增長的,而時間複雜度就是衡量演算法執行的基本運算元的乙個函式。對於插入排序來說,當需要排列的陣列分別為順序排列和逆序排列時,演算法的時間複雜度是不一樣的。根據演算法執行的每一...
演算法導論學習筆記(2)
big o notation 模擬為小於等於 n2 o n o n2 big omega notation 模擬為 大於等於 模擬為等於 嚴格符號 小o與小 模擬為小於和大於 解遞迴方法 1 替換法 guess the form,verify by induction,solve the const...