#!/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()
开始啦

 

posted on 2019-03-07 13:42  Andy_ouyang  阅读(273)  评论(0编辑  收藏  举报