標籤:for print start 最大 深度 系統 python 第一個 快速排序
今天看了兄弟連php裡面的冒泡排序與快速排序,想了下應該可以用python實現。
冒泡排序函數:
def mysort(x): len1 = len(x) for i in range(len1-1,0,-1): for j in range(0,i): if x[j]>x[j+1]: x[j],x[j+1]=x[j+1],x[j] return x
第三行代碼,是讓i的值9到1,因為冒泡排序是大的數往後冒,當第二次迴圈時,最大的數已經在最後了,所以不需要在比較一次。
同理,第三次,只要讓其比較到len1-2 ,第四次,比較到len1-1。
這樣迴圈次數可以減少一半。
python支援直接交換列表值,這點也比較方便。
快速排序函數:
def qsort(x):
if (x == []) :
return []
len1 = len(x)
left = []
right = []
key = x[0]
for i in range(1,len1):
if(x[i]<=key):
left.append(x[i])
else:
right.append(x[i])
left = qsort(left)
right = qsort(right)
return left + [key] + right
快速排序的先有一個比較值key,這裡取列表中的第一個值。讓列表中的其他值與其比較。
如果小於它就放在right列表中,
如果大於它就放在left列表中。
然後遞迴。(對遞迴也不是很理解。只知道函數本身自己調用自己。)
最後將left、比較值key(需要轉換成清單類型)、right串連在一起即可。
出現了一個錯誤:
RuntimeError: maximum recursion depth exceeded while calling a Python object
查詢得知:
原來在python裡面,遞迴函式的最大深度是999。超過這個深度就會報錯。
我們只要在代碼前面加上
import syssys.setrecursionlimit(1000000)
設定成1000000即可解決。
最後的代碼以及測試效率:
#!usr/bin/env python#!coding=utf-8__author__ = ‘zhengjim‘import timeimport randomimport syssys.setrecursionlimit(1000000)def mysort(x): len1 = len(x) for i in range(len1-1,0,-1): for j in range(0,i): if x[j]>x[j+1]: x[j],x[j+1]=x[j+1],x[j] return xdef qsort(x): if (x == []) : return [] len1 = len(x) left = [] right = [] key = x[0] for i in range(1,len1): if(x[i]<=key): left.append(x[i]) else: right.append(x[i]) left = qsort(left) right = qsort(right) return left + [key] + rightif __name__ == ‘__main__‘: x=[] for i in range(1000000): j = random.randint(1,10000) x.append(j) start = time.clock() qsort(x) # 改變函數,比較效率 end =time.clock() print ‘%f‘ % (end -start)
定義了一個1000000的亂序列表。
實驗結果:
# 冒泡排序 跑了5分鐘以上
# 快速排序 12.017942
#系統函數 0.428260
python 冒泡排序與快速排序 遇到的錯誤與問題