import random
import time
def shuffle1():
"""
算法思路:将54张牌编号为有顺序的列表,通过rendom.shuffle方法实现编号乱并返回list
:return: item顺序打乱后的列表
"""
item = [i for i in range(10000)]
random.shuffle(item)
return item
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
# 快排思路
"""
li = [5, 7, 4, 6, 3, 1, 2, 9, 8]
从li中随机取一个数字P(例如选第一个元素),然后使元素p归位
列表被p分成两部分,左边都比p小,右边都比p大;
递归完成排序。
P归位:[2, 1, 4, 3, 5, 6, 7, 9, 8]
目标:[1, 2, 3, 4, 5, 6, 7, 8, 9]
"""
li = [5, 7, 4, 6, 3, 1, 2, 9, 8]
def quick_sort_x(data, left, right):
"""
:param data: 需要排序的数据
:param left: 左边的部分
:param right: 右边的部分
:return:
"""
# 递归中止条件
if left < right:
# mid 放好元素的下标
mid = partition(data, left, right)
quick_sort_x(data, left, mid - 1)
quick_sort_x(data, mid + 1, right)
def partition(data, left, right):
"""
li = [5, 7, 4, 6, 3, 1, 2, 9, 8]
先拿一个变量存储选中的元素(例如0号元素),此时data的0号就在左边产生了一个空位 li = [None, 7, 4, 6, 3, 1, 2, 9, 8]
因为左边产生一个空位,此时就从右边开始找(因为0号空位,0号右边的元素都不应该比0号空位的元素大)
当右边的元素比0号空位的元素打时则继续寻找下一个,当比0号空位元素小的时候就继续找下一个[2, 7, 4, 6, 3, 1, None, 9, 8]
当右边产生一个空位时则从左边开始,拿左边的元素和0号空位元素对比
当左边的元素比0号空位的元素小 则此元素不动,然后继续往下找。
然后依次左边有空位就从右对比0号元素找,右边有空位就从左对比0号元素,直到两边都找到相同的位置就停止,然后把0号空位的元素放到此位置
:param data:
:param left:
:param right:
:return:
"""
tmp = data[left]
# 当左右还没相遇时就一直找
while left < right:
while left < right and data[right] >= tmp:
# 当右边找到元素大于或等于0号空位元素时 则他的位置不变,然后继续找下一个,所以索引减1
right -= 1
# 当右边的元素比0号空位元素小 就把此元素放放入左空位
data[left] = data[right]
while left < right and data[left] <= tmp:
# 当右边找到大于或等于0号空位元素时 则他的位置不变
left += 1
# 当左边的元素比0号空位元素小 就把此元素放放入右空位
data[right] = data[left]
data[left] = tmp
return left
@cal_time
def quick_sort(data):
return quick_sort_x(data, 0, len(data) - 1)
quick_sort(shuffle1())