演算法導論 python實踐(2 簡單排序演算法)

2021-08-21 05:40:33 字數 1794 閱讀 3725

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...