寫這篇文章並不是面向讀者的,主要就是當記筆記。
我的程式設計基礎太爛,我之前想我以後要搞工程,也不搞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...