生活随笔
收集整理的這篇文章主要介紹了
快速排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
速排序
#快速排序法
'''
思路分析:
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) #快排排序
打印如下:
總結
以上是生活随笔為你收集整理的快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。