Fighting-算法-快速排序

"""
快速排序的思想是基于分治法的思想:
在待排序的表L[1...n]中任意取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1...k-1] 和 L[k+1...n],
使得L[1...k-1]中所有元素小于pivot, L[k+1...n]中所有的元素大于或等于pivot,则pivot放在了其最终位置L[k]上,
这个过程称为一趟排序。
而后分别对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素都放在了最终位置上。


"""


def QuickSort(lists, low , high):
    """
    主函数
    :param lists: 传入一个列表
    :param low: 列表的下表0
    :param high: 列表的下表len(lists)-1
    """
    if low < high:
        pivotpos = Partition(lists, low, high)
        QuickSort(lists, low, pivotpos-1)
        QuickSort(lists, pivotpos+1, high)


def Partition(lists, low, high):
    """
    把当前表中的第一个元素作为基准pivot对表进行划分,
    则必须将表中比pivot大的元素像右移,比pivot小的元素像左移,使得经过一趟排序后,表中的元素被pivot一分为二。
    :param lists:
    :param low:
    :param high:
    :return:
    """
    pivot = lists[low]
    while low < high:
        # 从后往前找 < pivot 值,与其交换
        while low < high and lists[high] > pivot:
            high = high - 1
        else:
            lists[low] = lists[high]
        # 从前往后找 > pivot 值,与其交换
        while low < high and lists[low] <= pivot:
            low = low + 1
        else:
            lists[high] = lists[low]
    lists[low] = pivot
    return low

"""
快速排序的另一种实现方法:
"""


def quicksort(nums):
    if len(nums) <= 1:
        return nums
    left = []
    right = []
    pivot = nums.pop()
    for x in nums:
        if x < pivot:
            left.append(x)
        else:
            right.append(x)

    return quicksort(left) + [pivot] + quicksort(right)


if __name__ == '__main__':
    lists = [46, 79, 56, 38, 40, 84]
    print(lists)
    print(quicksort(lists))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值