首页 > 编程语言 >排序算法的巅峰之选:学习Python快速排序!

排序算法的巅峰之选:学习Python快速排序!

时间:2023-07-06 09:47:09浏览次数:39  
标签:sort Python 之选 元素 算法 quick 排序 基准

快速排序(Quick Sort)是一种高效的排序算法,它的基本思想是通过分治的策略将一个大问题分解成小问题并解决。快速排序的核心操作是选取一个基准元素,将待排序序列划分成左右两部分,其中左部分的元素都小于基准元素,右部分的元素都大于基准元素。然后递归地对左右两部分进行排序,最终完成整个序列的排序。本文将详细介绍快速排序算法的原理和实现,并提供相关的Python代码示例。

一、算法原理

快速排序算法的步骤如下:

  1. 选择一个基准元素(通常选择第一个或最后一个元素)。
  2. 将序列划分成两部分,使得左部分的元素都小于基准元素,右部分的元素都大于基准元素。这个过程称为分区(Partition)。
  3. 对左右两部分递归地应用步骤1和步骤2,直到每个部分只剩下一个元素或为空。

快速排序的核心思想是通过不断地划分和排序子序列,最终完成整个序列的排序。

二、快速排序的实现

下面是使用Python实现快速排序算法的代码:

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    else:
        pivot = arr[0]  # 选择第一个元素作为基准元素
        less = [x for x in arr[1:] if x <= pivot]  # 小于等于基准元素的子序列
        greater = [x for x in arr[1:] if x > pivot]  # 大于基准元素的子序列
        return quick_sort(less) + [pivot] + quick_sort(greater)

# 测试代码
numbers = [4, 2, 6, 1, 3]
sorted_numbers = quick_sort(numbers)
print(sorted_numbers)  # 输出:[1, 2, 3, 4, 6]

在上述代码中,quick_sort()函数接受一个待排序的列表作为输入,并对列表进行快速排序。算法使用递归方式实现。首先选择列表的第一个元素作为基准元素(也可以选择最后一个元素),然后通过列表解析的方式将列表划分成两部分:小于等于基准元素的子序列和大于基准元素的子序列。最后,将子序列和基准元素合并起来,得到最终的排序结果。

三、算法分析

快速排序是一种原址排序算法,即在排序过程中直接修改原始列表,不需要额外的存储空间。快速排序的平均时间复杂度为O(nlogn),其中n是待排序序列的长度。在大多数情况下,快速排序是一种高效的排序算法。然而,在最坏情况下,即待排序序列已经有序或基本有序时,快速排序的时间复杂度为O(n^2),性能下降。
为了避免最坏情况的发生,可以采用一些优化方法,如随机选择基准元素、三数取中法选择基准元素、使用插入排序优化小规模数据等。

四、优化思路

优化1:随机选择基准元素

为了避免最坏情况的发生,可以随机选择基准元素。在每次分区时,随机选择一个元素作为基准元素,而不是固定选择第一个或最后一个元素。这样可以降低最坏情况发生的概率,提高算法的性能。

import random

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    else:
        pivot_index = random.randint(0, len(arr) - 1)  # 随机选择一个索引作为基准元素的索引
        pivot = arr[pivot_index]
        arr[0], arr[pivot_index] = arr[pivot_index], arr[0]  # 将基准元素交换到第一个位置
        less = [x for x in arr[1:] if x <= pivot]
        greater = [x for x in arr[1:] if x > pivot]
        return quick_sort(less) + [pivot] + quick_sort(greater)

优化2:三数取中法选择基准元素

另一种优化方法是使用三数取中法选择基准元素。这种方法通过从待排序序列的首、尾和中间选择三个元素,并将它们排序后的中间元素作为基准元素,来降低最坏情况的概率。

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    else:
        first = arr[0]
        last = arr[-1]
        mid = arr[len(arr) // 2]
        pivot = sorted([first, mid, last])[1]  # 选择三个元素排序后的中间元素作为基准元素
        pivot_index = arr.index(pivot)
        arr[0], arr[pivot_index] = arr[pivot_index], arr[0]
        less = [x for x in arr[1:] if x <= pivot]
        greater = [x for x in arr[1:] if x > pivot]
        return quick_sort(less) + [pivot] + quick_sort(greater)

优化3:使用插入排序优化小规模数据

对于小规模的数据,快速排序的性能可能不如插入排序。因此,可以设置一个阈值,当待排序序列的长度小于等于阈值时,使用插入排序来提高算法的性能。

def quick_sort(arr, threshold=10):
    if len(arr) <= threshold:
        return insertion_sort(arr)  # 使用插入排序进行优化
    else:
        # 正常的快速排序逻辑
        pivot_index = random.randint(0, len(arr) - 1)
        pivot = arr[pivot_index]
        arr[0], arr[pivot_index] = arr[pivot_index], arr[0]
        less = [x for x in arr[1:] if x <= pivot]
        greater = [x for x in arr[1:] if x > pivot]
        return quick_sort(less, threshold) + [pivot] + quick_sort(greater, threshold)

五、总结

本文介绍了快速排序算法的原理和实现,并提供了相关的Python代码示例。快速排序是一种高效的排序算法,在大多数情况下表现良好。然而,在最坏情况下,其性能可能下降。为了避免最坏情况的发生,可以采用随机选择基准元素和三数取中法选择基准元素的优化方法。另外,对于小规模的数据,可以使用插入排序进行优化。通过掌握快速排序的原理和优化思路,我们可以更好地理解和应用这一经典的排序算法。
关注我,更多精彩内容立即呈现!

标签:sort,Python,之选,元素,算法,quick,排序,基准
From: https://www.cnblogs.com/shiqianlong/p/17531220.html

相关文章

  • 归并排序思考记录与代码实现 --- 图画的真累
    归并排序把数组不断从中间拆分,然后对前后两段分别排序,再将排好序的两部分合并在一起如下图数组排序。——分治思想:把大问题分解为小问题来解决,这通常会用到递归。由代码可知,归并排序就是将数组不断地从中间切开,然后对每份切开的前后排进行排序两种不用额外空间的算法,在......
  • python: Ten Sort Algotrthms
     #encoding:utf-8#Author:geovindu,GeovinDu涂聚文.#IDE:PyCharm2023.1python11#Datetime:2023/7/220:25#User:geovindu#Product:PyCharm#Project:pythonStudyDemo#File:TenSortAlgotrthms.py#explain:学习......
  • python: PyCharm 2023.1打包项目成执行程序
        IDE最底部:pyinstaller-iheart.ico-Dmain.py     ......
  • python excel 模块优劣
    '''xlrd库:从excel中读取数据,支持xls、xlsxxlwt库:对excel进行修改操作,不支持对xlsx格式的修改xlutils库:在xlw和xlrd中,对一个已存在的文件进行修改openpyxl:主要针对xlsx格式的excel进行读取和编辑xlwings:对xlsx、xls、xlsm格式文件进行读写、格式修改等操作xlsxwriter:用来生......
  • go语言结构体排序
    排序接口从接口定义来看,要实现某类型的排序要知道有多少个元素2个指定索引的元素怎么比较大小,索引i的元素小于索引j的值返回true,反之返回false如何交换指定索引上的元素那么自定义类型,要想排序,就要实现sort包中该接口。结构体排序 假设有N个学生,学生有姓名和年龄,按照年龄......
  • Python教程(2)——开发python常用的IDE
    为什么需要IDE在理解IDE之前,我们先做以下的实验,新建一个文件,输入以下代码total_sum=0forxinrange(1,101): total_sum+=xprint(total_sum)非常非常简单的一个程序,主要就是计算1加到100的值,我们将它重命名为test.py,记住后缀名是改为py,然后保存。这时候打开cmd窗口,运......
  • python变量
    1.变量命名变量名只能包含字母、数字和下划线。变量名不能以数字开头。变量名不能包含空格,可使用下划线python关键字和函数名不能用作变量慎用1和大写O变量名默认用小写字母表示2.多个变量同时赋值x,y,z=1,2,3print(f"{x}{y}{z}")3.常量常量名默认用全大写......
  • 17.python-魔术方法
    python魔术方法-示例目录python魔术方法-示例特殊属性构造方法基本方法模拟容器类属性相关比较操作符运算符相关反运算增量赋值运算一元操作符类型转换上下文管理器参考资料特殊属性属性含义__name__类、函数、方法的名字,不能实例调用__module__类、函数、......
  • python数值变量
    1.整数#+-*/%2+3#乘方3**2(2+3)*42.浮点数#精度有误0.2+0.13.整数和浮点数#除的结果总是浮点数4/2#其他运算,一个整数一个浮点数,结果也是浮点数1+2.03.0**23**2.04.数中的下划线big=14_000_000_000print(big)......
  • Python的set集合详解
     Python还包含了一个数据类型——set(集合)。集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。集合对象还支持union(联合),intersection(交),difference(差)和sysmmetricdifference(对称差集)等数学运算。创建集合set大括号或set()函数可以用来创建集......