《演算法基礎》所有演算法的Python實現

2021-08-08 20:49:49 字數 4735 閱讀 3398

寫這篇文章並不是面向讀者的,主要就是當記筆記。

我的程式設計基礎太爛,我之前想我以後要搞工程,也不搞acm,所以一直沒有重視演算法。但是現在想來,之前的想法就實在可笑了。演算法基礎不行,不論是搞工程還是搞學術,都太容易觸碰到自己的天花板。一句話:目光短淺!

現在打算每天晚上花1~2個小時用在演算法上。看演算法書或在網上刷題。

由於個人能力尚且太淺,如果真的有人看我下面的**的話,還請多多指教!

為了比較效能,我寫了個用於函式計時的裝飾器:

import time

from functools import wraps

defftimer

(func):

@wraps(func)

deffunction_timer

(*args,**kwargs):

t0=time.time()

result=func(*args,**kwargs)

t1=time.time()

print

'the running time of function "%s" is %.12f seconds' %(func.__name__,t1-t0)

return result

return function_timer

於是每次寫**前要先

from decorators import ftimer
p12 linear-search(a,n,x)

@ftimer

deflinear_search

(a,n,x):

ans='not_found'

for i in range(n):

if a[i]==x:

ans=i+1

return ans

nums=[0,5,2,3,1,4,6]

n=len(nums)

x=int(raw_input('input a num to search:'))

ans=linear_search(nums,n,x)

print

'the anwser is',ans

p13 better-linear-search(a,n,x)

@ftimer

deflinear_search

(a,n,x):

ans='not_found'

for i in range(n):

if a[i]==x:

ans=i+1

break

return ans

nums=[0,5,2,3,1,4,6]

n=len(nums)

x=int(raw_input('input a num to search:'))

ans=linear_search(nums,n,x)

print

'the anwser is',ans

p14 sentinel-linear-search(a,n,x)

@ftimer

deflinear_search

(a,n,x):

last=a[n-1]

a[n-1]=x

i=0while a[i]!=x:

i+=1

a[n-1]=last

if i1

or a[n-1]==x:

return i+1

return

'not_found'

nums=[0,5,2,3,1,4,6]

n=len(nums)

x=int(raw_input('input a num to search:'))

ans=linear_search(nums,n,x)

print

'the anwser is',ans

今天到此為止。打卡,嘀~

2017/9/28

2017/10/5

寫完沒儲存就關了。。今天主要寫了查詢和排序的幾個演算法

今天實在不想再碼一遍了,在網上找了個寫排序比較好的部落格

借他幾段**,其他幾段**,尤其是幾個查詢的**,以後有空了在碼一遍,反正這種基本功多碼幾遍也虧不了

再推薦一篇文章

插入排序

def

insert_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

希爾排序

這個還需要好好研究一下

def shell_sort(lists):

# 希爾排序

count = len(lists)

step = 2

group = count / step

while

group > 0:

for i in range(0, group):

j = i + group

while j < count:

k = j - group

key = lists[j]

while k >= 0:

if lists[k] > key:

lists[k + group] = lists[k]

lists[k] = key

k -= group

j += group

group /= step

return lists

氣泡排序

def

bubble_sort

(lists):

# 氣泡排序

count = len(lists)

for i in range(0, count):

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

if lists[i] > lists[j]:

lists[i], lists[j] = lists[j], lists[i]

return lists

快速排序

這個還需要再看看

def quick_sort(lists, left, right):

# 快速排序

ifleft >= right:

return lists

key = lists[left]

low = left

high = right

while

left

< right:

while

left

< right

and lists[right] >= key:

right -= 1

lists[left] = lists[right]

while

left

< right

and lists[left] <= key:

left += 1

lists[right] = lists[left]

lists[right] = key

quick_sort(lists, low, left - 1)

quick_sort(lists, left + 1, high)

return lists

選擇排序

def

select_sort

(lists):

# 選擇排序

count = len(lists)

for i in range(0, count):

min = i

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

if lists[min] > lists[j]:

min = j

lists[min], lists[i] = lists[i], lists[min]

return lists

歸併排序

def

merge

(left, right):

i, j = 0, 0

result =

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

defmerge_sort

(lists):

# 歸併排序

if len(lists) <= 1:

return lists

num = len(lists) / 2

left = merge_sort(lists[:num])

right = merge_sort(lists[num:])

return merge(left, right)

python基礎演算法 2021 1 11

快速排序 defkuaisu a,low,high if low high return left low right high flag a low while left while right left and a right flag right 1 a left a right while ...

演算法基礎( 演算法)

演算法基礎 演算法 hash演算法有兩種,即sha 1和md5演算法這裡先介紹md5演算法.md5產生乙個128位的hash值,在經過一寫初始樹立後,將明文分成了512位的塊,再將每一塊分成16個32位的子塊。演算法的輸出是4個32位的塊,連線起來構成128位的hash值。首先,將訊息填充到比512...

常用排序基礎演算法 python

基本思想 兩個數比較大小,較大的數下沉,較小的數冒起來。過程 平均時間複雜度 o n2 引用from random import randint defbubble sort arr,order true 氣泡排序演算法 param arr 需要排序的陣列 param order 排序方向預設為tr...