算法---快速排序

快速排序的步骤

  1. 在要排序的数组中找一个基准值
  2. 把小于基准值的数据集中到数组的左边(升序),把大于基准值的数据集中到数组的右边
  3. 数组的左边和右边重复上边的步骤,直到数组有序

代码(递归)

class Solution:


    def quick_sort(self, arr):
        n = len(arr)
        # 使用递归方法,下面是递归的结束条件
        if n <= 1:
            return arr
        # 一般以数组中间的元素为基准值
        mid_index = n // 2
        mid_val = arr[mid_index]
        left = []
        right = []
        for i in range(n):
            # 如果i为基准索引,则跳过操作
            if i == mid_index:
                continue
            # 把小于基准值的数据放在左数组中
            if arr[i] < mid_val:
                left.append(arr[i])
            else:
                # 把大于基准值的数据放在右数组中
                right.append(arr[i])
        # 将左数组,基准值和右数组整合在一起
        return self.quick_sort(left) + [mid_val] + self.quick_sort(right)


if __name__ == "__main__":
    arr = [8, 0, 4, 6, 1, 2, 7, 3, 5, 9]
    s = Solution()
    res = s.quick_sort(arr)
    print(res)

我们知道递归法一般是用空间换去时间,会加重内存的负担,因此我们可以使用时间换空间的方法。那就是使用双指针

代码(双指针)

import random
class Solution:
    def sort_once(self, arr, left, right):
        # 获取基准值
        pivot_index = random.randint(left, right)
        arr[pivot_index], arr[right] = arr[right], arr[pivot_index]
        pivot = arr[right]
        i = left - 1
        for j in range(left, right):
            if arr[j] < pivot:
                i += 1
                arr[i], arr[j] = arr[j], arr[i]
        arr[i + 1], arr[right] = arr[right], arr[i + 1]
        return i + 1

    def quick_sort(self, arr, left, right):
        if left < right:
            index = self.sort_once(arr, left, right)
            self.quick_sort(arr, left, index - 1)
            self.quick_sort(arr, index + 1, right)


if __name__ == "__main__":
    arr = [8, 0, 4, 6, 1, 2, 7, 3, 5, 9]
    s = Solution()
    s.quick_sort(arr, 0, len(arr) - 1)
    print(arr)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值