• 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

  • 相关阅读:
    centos7删除已经安装的docker
    docker -v挂载数据卷网络异常的问题
    docker数据拷贝
    通过nsenter连接docker容器
    centos6.5 mysql开机启动
    深度学习课程笔记(五)Ensemble
    深度学习课程笔记(四)Gradient Descent 梯度下降算法
    深度学习课程笔记(三)Backpropagation 反向传播算法
    深度学习课程笔记(二)Classification: Probility Generative Model
    深度学习课程笔记(一)CNN 卷积神经网络
  • 原文地址:https://www.cnblogs.com/zhengjim/p/6215701.html
Copyright © 2020-2023  润新知