码迷,mamicode.com
首页 > 编程语言 > 详细

python 冒泡排序与快速排序 遇到的错误与问题

时间:2016-12-23 18:39:52      阅读:169      评论:0      收藏:0      [点我收藏+]

标签: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 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

python 冒泡排序与快速排序 遇到的错误与问题

标签:for   print   start   最大   深度   系统   python   第一个   快速排序   

原文地址:http://www.cnblogs.com/zhengjim/p/6215701.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!