python中的快排

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())

 

posted @ 2019-07-08 22:17  平平无奇小辣鸡  阅读(222)  评论(0)    收藏  举报