速排序
#快速排序法
'''
思路分析:
1.取一个元素p,使元素p归位。
2.列表被p分成两部分,左边都比p小,右边都比p大,
3.递归完成排序。
关键点:
1.归位
2.递归
partition函数里的逻辑:
1.拿去左边第一个值假如是5,做比较,现在第一个位置为空
2.从右边开始找比5小的数,放到那个空的位置。找到后移过去,自己的位置又位空,
3.从左边找,比5大的数,移过去空的位置,以此类推。
4.最后叠加,重合。
5 1 7
_ 1 7
1 _ 7
时间的复杂度: n*logn
最坏情况:n* 如:987654321
预防:随机找一个元素,就不找第一个元素,跟第一个元素对调一下。
'''
import random
import copy
import sys
import time
sys.setrecursionlimit(100000) #更改最大递归深度
def cal_time(func):
def wrapper(*args, **kwargs):
t1 = time.time()
result = func(*args, **kwargs)
t2 = time.time()
print("%s running time: %s secs." % (func.__name__, t2-t1))
return result
return wrapper
def partition(li,left,right): #无序列表,最小值,最大值
tmp =li[left] #拿去左边第一个值
while left < right: #左边小于右边,就一直循环
while left < right and li[right] >= tmp:
right -= 1
li[left] = li[right] #把小于5的数,移到左边空的位置
while left < right and li[left] <= tmp:
left += 1
li[right] = li[left] #把大于的5的数,移到右边空的位置
li[left] = tmp #最后还需要归位。
return left
def _quick_sort(data,left,right): #data=列表,左边,右边
if left < right: #至少两个元素,才会递归
mid =partition(data,left,right)
_quick_sort(data,left,mid-1)
_quick_sort(data,mid+1,right)
#加壳处理
@cal_time
def quick_sort(li):
return _quick_sort(li,0,len(li)-1)
#系统排序
@cal_time
def sys_sort(li):
li.sort()
li = list(range(100000))
random.shuffle(li)
li1 = copy.deepcopy(li)
li2 = copy.deepcopy(li)
sys_sort(li1) #系统排序
quick_sort(li2) #快排排序
打印如下: