python 快速排序(冒泡优化)

python 快速排序(冒泡优化)

import random,time
start = time.time()
def QuickSort1(data,left,right,):#从小到大
    L = left  # 获取最左边坐标
    R = right  # 获取最右边坐标
    Middle = data[(L + R) // 2]  # 获取分割值,将数据分为两部分,大于Middle为一部分,小于Middle为一部分

    while L < R:  # 当左边的值不超过右边的值,说明没有遍历完所有数据,继续遍历
        while data[L] < Middle:  # 从左向右遍历,找到一个大于或者等于Middle的值
            L += 1
        while data[R] > Middle:  # 从右向左遍历,找到一个小于于或者等于Middle的值
            R -= 1
        if L >= R:  # 如果找到的是同一个,说明是Middle的值,直接退出,说明已经排好
            break
        data[L], data[R] = data[R], data[L]  # 如果不是,交换位置
        if data[L] == Middle:  # 如果此时左边值为Middle,说明左边已经排好,右边继续遍历
            R -= 1
        if data[R] == Middle:  # 如果此时右边值为Middle,说明右边已经排好,左边继续遍历
            L += 1
    if L == R:  # 如果L==R,说明同时指向middle,所以进行L += 1,R -= 1,将数据以middle分成两部分
        L += 1
        R -= 1
    if left < R:  # 分成两部分后,先进行左边递归,即当left>=R时,说明递归完毕,否则一直递归
        QuickSort1(data, left, R)
    if right > L:  # 然后进行右边递归
        QuickSort1(data, L, right)
    return data

def QuickSort2(data,left,right,):#从大到小
    L = left  # 获取最左边坐标
    R = right  # 获取最右边坐标
    Middle = data[(L + R) // 2]  # 获取分割值,将数据分为两部分,大于Middle为一部分,小于Middle为一部分
    while L < R:  # 当左边的值不超过右边的值,说明没有遍历完所有数据,继续遍历
        while data[L] > Middle:  # 从左向右遍历,找到一个小于或者等于Middle的值
            L += 1
        while data[R] < Middle:  # 从右向左遍历,找到一个大于或者等于Middle的值
            R -= 1
        if L >= R:  # 如果找到的是同一个,说明是Middle的值,直接退出,说明已经排好
            break
        data[L], data[R] = data[R], data[L]  # 如果不是,交换位置
        if data[L] == Middle:  # 如果此时左边值为Middle,说明左边已经排好,右边继续遍历
            R -= 1
        if data[R] == Middle:  # 如果此时右边值为Middle,说明右边已经排好,左边继续遍历
            L += 1
    if L == R:  # 如果L==R,说明同时指向middle,所以进行L += 1,R -= 1,将数据以middle分成两部分
        L += 1
        R -= 1
    if left < R:  # 分成两部分后,先进行左边递归,即当left>=R时,说明递归完毕,否则一直递归
        QuickSort2(data, left, R)
    if right > L:  # 然后进行右边递归
        QuickSort2(data, L, right)
    return data
    
def QuickSort(data,left,right,reverse = False):
    if not reverse:
        data1 = QuickSort1(data,left,right)
    else:
        data1 = QuickSort2(data, left, right)
    return data1

if __name__ == '__main__':
    # data = [8,9,1,7,2,3,9,1,5,4,6,0]
    data = [random.randint(1,10000) for i in range(10000)]
    ret = QuickSort(data,0,len(data)-1,reverse=True)
    # print(ret)
    end = time.time()
    print(end-start)
    input()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值