06-十大排序算法-快速排序-Python实现

算法排序 【快速排序】

时间作者版本内容备注
2023/08/03henry_oulen@163.comv1.0算法排序-快速排序

1.快速排序介绍

基本思想:

(1)在待排序的元素任取一个元素作为基准(通常选第一个元素,但最好的选择方法是从待排序元素中任选一个作为基准),称之为基准元素;

(2)将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;

(3)对左右两个分区重复以上步骤直到所有元素都是有序的;

算法实现:

初始化时以第一个数据元素作为基准元素,用一个base值来确定并保存当前基准数据的值;用right从右向左扫描数组数据,找到小于base基准数据的数据元素;找到后将该元素与left为下标的数据交换,并将这时left到right之间的数据往前移;如果base基准数据左右两边的数据都已经分别按小于和大于的方式放在了指定区域,则分别再对小于和大于它的区域中的数据元素重复前面的操作。

对于一个无序数组arr{4,6,8,5,9}来说我们来进行以下几个步骤:

(1)用一个base值来确定并保存当前基准数据4,left为数组的初始下标0,right为数组的末尾下标4,用right从右向左扫描数组数据,找到小于base基准数据的数据元素,但我们发现没有小于4的数据,这时left等于right,这时就确定了小于4的区域和大于4的区域。

img

(2)因为小于4的没有数据,所以4已经有序了,那么我们看大于4的区域。我们继续(1)的步骤,base指向这个区域的第一个数据元素6,这个区域的left为该区域的首元素下标1,right仍然为数组的末尾下标4,再用right从右向左扫描数组数据,找到小于base基准数据的数据元素,我们发现有5(arr[3])小于基准数据元素base(6),那么我们将它5的值赋给arr[left]也就是6,再将left向右移动1的值,最后将arr[left](即8)赋值arr[right](即5)并且再把base的值赋给arr[left],这样就将小于base的数据放到了小于base区域。

img

(3)这时其实看来这个数组已经有序了,但是我们仍然还要将重复(1)(2)步骤一直到left走到数组的最后一个元素为止。

img

这样我们就将无序数组{4,6,8,5,9}排序为一个有序数组{4,5,6,8,9}

2.代码实现-Python

#!/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@author: henry_oulen@163.com
@file: 06-快速排序.py
@time: 2023/8/4 16:00
@desc: 
"""

import random
import time


def func_time(func):
    def innrer(*args, **kwargs):
        start_time = time.time()
        result = func(*args, *kwargs)
        end_time = time.time()
        print('函数运行时间为:', end_time - start_time, 's')
        return result

    return innrer


def partionSort(arr, leftIndex: int, rightIndex: int):
    """

    :param arr: 待排序数组
    :param leftIndex: 左下标
    :param rightIndex: 右下标
    :return:
    """
    i = leftIndex
    j = rightIndex
    pviot = arr[leftIndex]

    while i != j:
        while i < j and arr[j] > pviot:
            j -= 1
        while i < j and arr[i] <= pviot:
            i += 1
        if i < j:
            arr[i], arr[j] = arr[j], arr[i]

    arr[leftIndex], arr[i] = arr[i], arr[leftIndex]
    return i


def quickSort(arr: list, leftIndex: int, rightIndex: int):
    # if len(arr) <= 1:
    #     return arr
    if leftIndex < rightIndex:
        pivot = partionSort(arr, leftIndex, rightIndex)
        quickSort(arr, leftIndex, pivot - 1)
        quickSort(arr, pivot + 1, rightIndex)

    return arr


# @func_time
def main(arr: list):
    """
    :param arr: 需要排序的列表 长度大于1
    :return:
    """

    arr = quickSort(arr, 0, len(arr) - 1)
    return arr


if __name__ == '__main__':
    arr = [random.randint(0, 10000) for i in range(10)]
    print("排序前列表:", arr)
    arr = main(arr)
    print("排序后列表:", arr)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值