Python演算法學習

2021-08-18 08:20:39 字數 3157 閱讀 6153

把教材《演算法設計與分析》的c/c++理解並翻譯成python

練習python+演算法

從小到大排序

# 這一輪下來後,lists[count-i-1]就會是這次排序中遇到的最大的數,所以第一次外迴圈時,陣列的最後乙個數就是陣列中最大的數

lists[j],lists[j+1]=lists[j+1],lists[j]

return lists

lists=[22,55,84,21,2,4,100]

lists=bubble_sort(lists)

print lists

將兩個有序的子陣列a,b,合併為乙個有序的陣列new

def merge(a,b):

new =

m,n=0,0

while m

ifa[m]1

else:

n +=1

if m

fornumin range(m,len(a)):

else:

fornumin range(n,len(b)):

return

newif __name__=='__main__':

la=[1,3,5,7,9]

lb=[0,2,4,6,8,10,11,12]

print(merge(la,lb))

# 輸出結果:

# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

首先判斷陣列中最前面的兩個元素,並使它們按照遞增順序排序;然後把第3個元素與前兩個元素一次進行比較,並把它放在合適的位置,使得前面3個元素是有序的;接下來第4,第5,……直到第n個元素與前面n-1個元素一次進行比較,把它放在合適的位置,這樣就成為乙個有序的陣列了

# 參考

definsert_sort

(lists):

# 從小到大排序

count = len(lists)

for i in range(1, count):

key = lists[i]

j = i - 1

while j >= 0:

if lists[j] > key:

lists[j + 1] = lists[j]

lists[j] = key

j -= 1

return lists

lists=[10,5,12,6,8]

print insert_sort(lists)

或者

def

insert_sort

(lists):

# 從小到大

for i in range(1,len(lists)):

key=lists[i]

for j in range(0,i):

if lists[j]>key:

# 開始往後挪

k=iwhile k>=j:

lists[k]=lists[k-1]

k-=1

lists[j]=key

# 注意這裡要有乙個break,不然明明已經比較並放在正確位置後會繼續比較一次,然後就會有乙個數不見了

break

return lists

lists=[10,5,12,6,8,2,88,20]

print insert_sort(lists)

給定乙個有序的元素列表和乙個數,查詢該數在這個有序列表中的位置,使用二分查詢每次可以排除一半的元素

# o(log n) 

defbinary_search

(list,item):

low=0

high=len(list)-1

while low<=high: #只要範圍沒有縮小到只剩乙個元素

mid=(low+high)/2

guess=list[mid]

if guess==item:

return mid

if guess > item:

high=mid-1

if guess < item:

low=mid+1

return

none

#測試一下

mylist=[1,3,5,7,9]

print binary_search(mylist,3)

print binary_search(mylist,-1)

# 輸出:

# 1

# none

將a柱子上的圓盤按一定規則借助b柱子完美地複製到c柱子上。規則:每次移動乙個盤子,且只能讓小的放在大的上面

演算法思路:①先用c柱子作為輔助,遞迴呼叫本演算法,把a最上面的n-1個圓盤移到b柱子;②再把下面的一片圓盤從a移動到c;③最後再用a作為輔助,遞迴呼叫本演算法,把n-1片圓盤從b移到c。

# -*- coding: utf-8 -*-

defmove

(n,a,b,c):

if n==1:

print('將%s上的%s從%s->%s'%(a,n,a,c))

else:

# ①=》②=》③

move(n-1,a,c,b)

print('將%s上的%s從%s->%s'%(a,n,a,c))

move(n-1,b,a,c)

#測試move(4,'a','b','c')

好久之前寫的,有點亂

參考:

Python演算法學習《二》

說謊問題 某地發生了一件 案,警察通過排查確定殺人 必為4個 嫌疑犯的乙個。以下為4個嫌疑犯的供詞。a說 不是我。b說 是c。c說 是d。d說 c在胡說 已知3個人說了真話,1個人說的是假話。現在請根據這些資訊,寫乙個程式來確定到底誰是 class solution object def who m...

演算法學習 python 6

氣泡排序 coding utf 8 def bubblesort list1 for j in range 0,len list1 1 增加乙個計數器 count 0 for i in range len list1 1 j,j,1 if list1 i list1 i 1 list1 i list...

python 演算法學習筆記1

python中array 是一整塊單一連續的記憶體區域,根據索引值訪問的話可以直接計算出目標元素在記憶體中的位置,對於鍊錶要從頭開始遍歷 鍊錶插入代價小,數值插入代價大,要移動右邊所有的元素 這邊的陣列指動態陣列 複雜度o 構建排序演算法之前先對序列進行檢查,如果目標已經排過序則直接返回 def s...