今天看了兄弟连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 sys sys.setrecursionlimit(1000000)
设置成1000000即可解决。
最后的代码以及测试效率:
#!usr/bin/env python #!coding=utf-8 __author__ = ‘zhengjim‘ import time import random import sys sys.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 x 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 if __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
时间: 2024-10-20 07:29:33