首页 > 编程语言 >Python算法——快速排序

Python算法——快速排序

时间:2023-12-09 11:32:11浏览次数:46  
标签:arr Python 基准 元素 算法 数组 quick 排序

快速排序(Quick Sort)是一种高效的分治排序算法,它选择一个基准元素,将数组分成两个子数组,小于基准的放在左边,大于基准的放在右边,然后递归地排序子数组。快速排序通常比冒泡排序和选择排序更高效,特别适用于大型数据集。本文将详细介绍快速排序的工作原理和Python实现。

快速排序的工作原理

快速排序的基本思想是:

  1. 选择一个基准元素(通常是数组中的某个元素)。
  2. 将数组分成两个子数组,一个包含小于基准的元素,另一个包含大于基准的元素。
  3. 递归地对两个子数组进行排序。

分治的关键在于如何选择基准元素以及如何分割数组。一种常见的方法是选择数组中间的元素作为基准,然后将数组分成两部分,一部分包含小于基准的元素,另一部分包含大于基准的元素。然后,递归地对这两部分进行排序。

下面是一个示例,演示快速排序的过程:

原始数组:[6, 5, 3, 1, 8, 7, 2, 4]

  1. 选择基准元素(通常选择中间元素,如 3)。
  2. 分割数组,小于 3 的元素在左边,大于 3 的元素在右边:[2, 1, 3, 5, 8, 7, 6, 4]
  3. 递归地对左边的子数组进行排序,结果为 [1, 2, 3]。
  4. 递归地对右边的子数组进行排序,结果为 [4, 5, 6, 7, 8]。
  5. 合并两个子数组,得到排序后的数组:[1, 2, 3, 4, 5, 6, 7, 8]。

Python实现快速排序

下面是Python中的快速排序实现:

def quick_sort(arr):
    if len(arr) <= 1:
        return arr

    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]

    return quick_sort(left) + middle + quick_sort(right)
  • arr 是待排序的数组。
  • 如果数组长度小于等于 1,则已经有序,直接返回。
  • 选择基准元素 pivot,通常选择中间元素。
  • 使用列表推导式将数组分成三部分:小于 pivot、等于 pivot 和大于 pivot 的元素。
  • 递归地对左右两部分进行排序,然后合并结果。

示例代码

下面是一个使用Python进行快速排序的示例代码:

def quick_sort(arr):
    if len(arr) <= 1:
        return arr

    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]

    return quick_sort(left) + middle + quick_sort(right)

# 测试排序
arr = [6, 5, 3, 1, 8, 7, 2, 4]
sorted_arr = quick_sort(arr)
print("排序后的数组:", sorted_arr)

时间复杂度

快速排序的平均时间复杂度为 O(n log n),其中 n 是数组的长度。它是一种高效的排序算法,通常优于冒泡排序和选择排序。然而,在最坏情况下,时间复杂度可能达到 O(n^2)。

总之,快速排序是一种高效的排序算法,通过选择基准元素和分割数组,递归地对子数组进行排序,实现了对数组的快速排序。了解快速排序有助于理解排序算法的高效性,并为大型数据集的排序提供了一个强大的工具。

标签:arr,Python,基准,元素,算法,数组,quick,排序
From: https://blog.51cto.com/u_16295743/8746794

相关文章

  • 双栈排序
    还是建议看看yxc的题解这是先考虑了一个栈的情况,再从一个栈的情况扩充到两个栈来说明一下他对性质的证明首先满足条件的二元组式肯定不能够被放在同一个栈里面的,那么如果我将原序列分成两个组,其中每个组中的任意二元组都不满足条件(注意\(k\)不一定要局限于分组之后的同一组,而是......
  • Python:函数综合案例-黑马ATM
    综合案例:黑马ATM主菜单查询余额效果存取款效果#总额totaltotal=5000000#定义None影响不大,可以不定义name=None#要求客户输入姓名name=input("请输入您姓名:")#菜单提示defmenu():print("-"*19+"主菜单"+"-"*19)print(f"{name},您......
  • Python:数据容器-list(列表)
    列表定义语法:字面量[元素1,元素2,元素3,...]定义变量变量名称=[元素1,元素2,元素3,...]定义空列表变量名称=[]变量名称=list()列表内的每个数据,称之为元素以[]作为标识列表内每个元素用,逗号隔开注意事项:列表可以一次多个数据,且可以为不同数据类型,支持嵌套"......
  • Python:列表的下标索引
    列表的下标(索引):取出特定位置的数据语法:列表[下标索引]列表的下标(索引)-反向反向索引就是从后向前:从-1开始,依次递减(-1、-2、-3...)嵌套列表的下标(索引)列表[内层列表[索引]]#通过下标索引取出对应位置的数据my_list=["itheima",666,True]#列表[下标索引],从前向后从......
  • Python:列表的常用操作方法
    列表上限:2**63、922372036854775807个查询元素查找指定元素在列表的下标,如果找不到,报错ValueError语法:列表.index(元素)插入元素在指定下标位置,插入指定的元素语法:列表.insert(下标,元素)追加元素将指定元素,追加到列表的尾部语法:列表.append(元素)将其他数据容器的内容......
  • Python:列表的循环遍历
    while循环遍历for循环遍历#列表的遍历-while循环遍历deflist_while_func():"""列表的遍历-while循环遍历:return:None"""list1=[21,25,21,23,22,20]index=0whileindex<len(list1):tmp=list1[ind......
  • Python:元组的定义和操作
    1、元组的定义语法:定义元组使用小括号,且使用逗号隔开各个数据元组面量(元素1,元素2,元素3,...)定义元组变量变量名称=(元素1,元素2,元素3,...)定义空元组变量名称=()变量名称=tuple()2、元组的特点元组同列表一样,可以存储多个、不同的数据类的元素(混装)元组一旦定义完......
  • Python中函数的基础定义语法
    1、函数的定义语法:def函数名(传入参数):函数体return返回值2、函数的调用:函数名(参数)3、函数使用步骤:先定义函数后调用函数4、注意事项:参数不需要,可以省略返回值如不需要,可以省略函数必须先定义后使用#定义一个函数,输出相关信息defsay_hi():......
  • Python中函数的传入参数
    函数的传入参数:在函数进行计算的时候,接受外部(调用时)提供数据函数的定义语法:def函数名(传入参数):函数体return返回值函数定义的x和y称之为形式参数(形参),表示函数声明将要使用2个参数参数之间使用逗号进行分隔函数调用的5和5称之为实际参数(形参),表示函数执行时真正使......
  • Python函数的返回值定义语法
    1、函数返回值的作用所谓返回值,就是程序中函数完成的事情后,最后给调用者的结果2、函数返回值的定义语法def函数名(参数...):函数体return返回值使用关键字:return来返回结果3、注意:函数体在遇到return后就结束,写在return后的代码不会执行#定义一个函数,完成2数相加......