zoukankan      html  css  js  c++  java
  • 冒泡排序,选择排序,快速排序

    #!/usr/bin/env python 
    # -*- coding: utf-8 -*-
    import random
    import time


    def cal_time(func):
    def inner(*args, **kwargs):
    start = time.time()
    res = func(*args, **kwargs)
    end = time.time()
    print("%s用时为%s" % (func.__name__, end - start))
    return res

    return inner


    冒泡排序

    @cal_time
    def bubble_sort(li):
        for i in range(len(li) - 1):
            flag = False
            for j in range(len(li) - 1 - i):
                if li[j] > li[j + 1]:
                    li[j], li[j + 1] = li[j + 1], li[j]
                    flag = True
            if not flag:
                return li
        return li


    选择排序

    @cal_time
    def select_sort(li):
        for i in range(len(li) - 1):
            mindoc = i
            for j in range(i + 1, len(li)):
                if li[mindoc] > li[j]:
                    li[mindoc], li[j] = li[j], li[mindoc]
        return li

    快速排序

    1、取一个参考值放到列表中间,初次排序后,让左侧的值都比他小,右侧的值,都比他大。

    2、分别对左侧和右侧的部分递归第1步的操作

    实现思路:

    • 两个指针left,right分别指向列表的第一个元素和最后一个元素,然后取一个参考值,默认为第一个列表的第一个元素list[0],称为K
    • 然后left指向的值先和参考值K进行比较,若list[left]小于或等于K值,left就一直向右移动,left+1,直到移动到大于K值的地方,停住
    • right指向的值和参考值K进行比较,若list[right]大于K值,right就一直向左移动,right-1,直到移动到小于K值的地方,停住
    • 此时,left和right若还没有相遇,即left还小于right,则二者指向的值互换
    • 若已经相遇则说明,第一次排序已经完成,将list[right]与list[0]的值进行互换,进行之后的递归
    def patition(li, left, right):
        tmp = li[left]
        while left < right:
            while left < right and tmp <= li[right]:
                right -= 1
            li[left] = li[right]
            while left < right and tmp >= li[left]:
                left += 1
            li[right] = li[left]
        li[left] = tmp
        return left
    
    
    def quick_sort(li, left, right):
        if left < right:
            mid = patition(li, left, right)
            quick_sort(li, left, mid - 1)
            quick_sort(li, mid + 1, right)
    
    
    @cal_time
    def quick(li, left, right):
        quick_sort(li, left, right)

    if __name__ == '__main__':
    # 冒泡排序
    li = [random.randint(1, 1000) for i in range(1000)]
    # res = bubble_sort(li)
    # print(res)

    # 选择排序
    # res=select_sort(li)
    # print(res)


    # 快速排序
    quick(li, 0, len(li) - 1)


    超出递归深度

    RuntimeError: maximum recursion depth exceeded

      在网上查了,发现python默认的递归深度是很有限的,大概是900多的样子,当递归深度超过这个值的时候,就会引发这样的一个异常。

    解决的方式是手工设置递归调用深度,方式为

    view plaincopy to clipboardprint?
    import sys   
    sys.setrecursionlimit(1000000) #例如这里设置为一百万  

    使用多线程同时执行三个算法

    import random
    import time
    from threading import Thread
    
    import sys
    
    sys.setrecursionlimit(10000000)
    
    
    def cal_time(func):
        def inner(*args, **kwargs):
            start = time.time()
            res = func(*args, **kwargs)
            end = time.time()
            print("%s用时为%s" % (func.__name__, end - start))
            return res
    
        return inner
    
    
    def patition(li, left, right):
        tmp = li[left]
        while left < right:
            while left < right and tmp <= li[right]:
                right -= 1
            li[left] = li[right]
            while left < right and tmp >= li[left]:
                left += 1
            li[right] = li[left]
        li[left] = tmp
        return left
    
    
    def quick_sort(li, left, right):
        if left < right:
            mid = patition(li, left, right)
            quick_sort(li, left, mid - 1)
            quick_sort(li, mid + 1, right)
    
    
    @cal_time
    def quick(li):
        quick_sort(li, left=0, right=len(l) - 1)
    
    
    @cal_time
    def select_sort(li):
        for i in range(len(li) - 1):
            mindoc = i
            for j in range(i + 1, len(li)):
                if li[mindoc] > li[j]:
                    li[mindoc], li[j] = li[j], li[mindoc]
        return li
    @cal_time
    def bubble_sort(li):
        for i in range(len(li) - 1):
            flag = False
            for j in range(len(li) - 1 - i):
                if li[j] > li[j + 1]:
                    li[j], li[j + 1] = li[j + 1], li[j]
                    flag = True
            if not flag:
                return li
        return li
    
    if __name__ == '__main__':
    
        l = [random.randint(1, 1000) for n in range(1, 5000)]
        ll = [select_sort, quick,bubble_sort]
        for i in ll:
            t = Thread(target=i, args=(l,))
            t.start()
    开始啦
  • 相关阅读:
    在windows安装部署ShardingSphere-Proxy 分库分表中间件
    报错:fatal: unable to access 'https://github.com/xxx/': OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
    一台Windows配置多个mysql服务
    解决.net core 部署IIS报错:HTTP Error 500.30
    vs code 不格式化注释
    .net工具类——URL请求数据
    .net工具类——URL处理
    .net工具类——读取写入cookie
    js没有权限
    ueditor图片上传
  • 原文地址:https://www.cnblogs.com/ouyang99-/p/10489098.html
Copyright © 2011-2022 走看看