怎么用python做战斗机_python中的快排

importrandomimporttimedefshuffle1():"""算法思路:将54张牌编号为有顺序的列表,通过rendom.shuffle方法实现编号乱并返回list

:return: item顺序打乱后的列表"""item= [i for i in range(10000)]

random.shuffle(item)returnitemdefcal_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))returnresultreturnwrapper#快排思路

"""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]defquick_sort_x(data, left, right):""":param data: 需要排序的数据

:param left: 左边的部分

:param right: 右边的部分

:return:"""

#递归中止条件

if left

mid =partition(data, left, right)

quick_sort_x(data, left, mid- 1)

quick_sort_x(data, mid+ 1, right)defpartition(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 =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]=tmpreturnleft

@cal_timedefquick_sort(data):return quick_sort_x(data, 0, len(data) - 1)

quick_sort(shuffle1())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值