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

时间: 2024-10-20 07:29:33

python 冒泡排序与快速排序 遇到的错误与问题的相关文章

Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。

Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素).在第一部分排序完成后,再将这

必知必会的冒泡排序和快速排序

前一篇给大家介绍了<优化的直接插入排序(二分查找插入排序,希尔排序)>,现在继续介绍其他排序算法 本博文介绍两个最常被提起的排序算法:冒泡排序和快速排序.冒泡排序是入门排序算法,思路比较常规,但确是最耗时的排序算法,所以听到冒泡排序笑一笑就好了,千万不要拿来装B.另一个是被誉为“20世纪最伟大的十大经典算法”的快速排序,以及针对数组特征进行优化的“随机快排”和“平衡快排”. 冒泡排序 (一)概念及实现 冒泡排序的原理:重复的遍历要排序的数组,每次遍历过程中从头至尾比较两个相邻的元素,若顺序错误

【PHP面试题】通俗易懂的两个面试必问的排序算法讲解:冒泡排序和快速排序

又到了金三银四找工作的时间,相信很多开发者都在找工作或者准备着找工作了.一般应对面试,我们无可厚非的去刷下面试题.对于PHPer来说,除了要熟悉自己所做的项目,还有懂的基本的算法.下面来分享下PHP面试中常会问到的算法:冒泡排序和快速排序 冒泡排序:一一对比排序 基本思想: 重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小)错误就把他们交换过来.走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成. 图解: 1.第一次:拿着数组的第一个元素

交换排序算法---冒泡排序与快速排序

本文介绍两种交换排序方法:冒泡排序.快速排序 冒泡排序 冒泡排序基本思想 每次遍历完序列都把最大(小)的元素放在最前面,然后再对剩下的序列重复前面的一个过程,每次遍历完之后待排序序列就少一个元素,当待排序序列减小为只有一个元素的时候排序就结束了.因此,复杂度在最坏的情况下是O(N ^2). 冒泡排序实现过程 将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡.根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘

内部排序算法(一):交换排序(冒泡排序,快速排序)

这是我的博文系列<内部排序算法>的第一篇.所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来.所谓内部排序,是指在排序过程中,若整个文件都是放在内存中处理,排序时不涉及数据的内.外存交换(外排序的定义则相反). 内部排序法按照策略可以划分为五类:插入排序.选择排序.交换排序.归并排序和分配排序.待排文件的存储方式采用顺序表(或直接用向量)作为存储结构(其他的存储结构还有以链表作为存储结构等). 在这个系列的博文中,我按照排序算法的给出,排序算法的分析(包括算法的时空复杂度

Python回顾与整理8:错误和异常

0.说明 如果想写出用户体验高的代码,那么就需要考虑到在执行自己写的这段代码中在和用户交互的过程中可能会出现的问题,也就是说,需要对可能出现的异常进行处理,只有做好这些工作,才能写出用户体验好的代码. 1.什么是异常 错误 错误是语法(导致解释器无法解释)或逻辑(也就是代码质量问题)上的,在Python中,当检测到错误时,解释器会指出当前流无法继续执行下去,于是就出现了异常. 异常 程序出现了错误而在正常控制流以外采取的行为. 根据上面的解释,可以理解为,只要解释器检测到程序运行时出现了错误(与

常用排序算法实现[交换排序之冒泡排序、快速排序]

相关知识 1. 稳定排序和非稳定排序: 稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序. 如果排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前. 2. 内排序和外排序 在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序: 在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序. 3.算法分类 排序算法从理论上分为如下几类: (1) 交换排序法:

解决eclipse编辑python程序的SyntaxError: Non-ASCII character错误

错误信息如下: File "E:\work\pydev\pythodemo\src\code\string.py", line 1 SyntaxError: Non-ASCII character '\xe5' in file E:\work\pydev\pythodemo\src\code\string.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for de

python在windows下安装模块错误

我的环境是win7+vs2013+python3.2,都是32位 windows下安装模块错误 1)Unable to find vcvarsall.bat : 打开"<python安装目录>\Lib\distutils\msvc9compiler.py" 找到 toolskey = "VS%0.f0COMNTOOLS" % version, 直接修改为 toolskey = "VS100COMNTOOLS"  (如果是vs2012或