使用代码实现快速排序

前言

怎么使用代码实现快速排序

方法1

创建两个列表分别保存有序值和无序值

代码如下:

def quickSort(nums):
    n = len(nums)
    if n <= 1:
        return nums
    left= []
    right = []
    piove = nums[0] #基准值
    for item in range(1,n):  # 第一个数不需要遍历
        if nums[item] > piove:
            right.append(nums[item])
        else:
            left.append(nums[item])
    print(left,piove,right)
    print('-'*30)
    return  quickSort(left)  + [piove]  +  quickSort(right)  # 函数调用,最后都是列表的相加

emp=[1,3,5,13,6,53,345,1,7,34,8,43,7,36,54324,57,4]
print(quickSort(emp))

# 这种方法容易理解但不是真正的快速排序,它开辟了额外的内存地址,对空间造成了浪费

方法2

挖坑和填坑法

代码如下:

def partition(nums, left, right):
    pivot = nums[left]  # 区域的第一个元素作为基准值
    while left < right:
        # 挖坑,填坑
        while left < right and nums[right] > pivot:
            right -= 1
        nums[left] = nums[right]
        while left < right and nums[left] <= pivot:
            left += 1
        nums[right] = nums[left]
    nums[left] = pivot  # 基准值的正确位置
    return left


def quickSort(nums, left, right):
    if left >= right:
        return
    # 分区  --> 分好区之后的基准值的索引
    pivot_idx = partition(nums, left, right)
    print(nums, pivot_idx)
    # 左边的区域, left->pivot_idx-1
    quickSort(nums, left, pivot_idx - 1)
    # 右边的区域, pivot_idx+1->right
    quickSort(nums, pivot_idx + 1, right)

test = [44, 12, 59, 36, 62, 43, 94, 7, 35, 52, 85]
quickSort(test, 0, len(test)-1)
print(test)

扩充:快速排序再次优化的几个可以考虑的方向
1.基准值的选取
(1)随机选取
(2)三数 mid

2.排序序列长度到一定大小后,改用插入排序

3.重复元素的处理
每次分割时,将与本次基准值相等的元素聚集在一起
(1)遇到相等的元素,放到区域的最左边或最右边
(2)分好区之后,相等的元素与基准值一边的元素进行交换

4.尾递归
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值