算法排序 【快速排序】
时间 | 作者 | 版本 | 内容 | 备注 |
---|---|---|---|---|
2023/08/03 | henry_oulen@163.com | v1.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的区域。
(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区域。
(3)这时其实看来这个数组已经有序了,但是我们仍然还要将重复(1)(2)步骤一直到left走到数组的最后一个元素为止。
这样我们就将无序数组{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)