快速排序:用Python实现简单高效的数组排序

快速排序是一种常用的排序算法之一,也是一种高效的排序方法,尤其擅长对大规模数据集排序。

一、算法原理

快速排序的基本思路是:选择一个基准元素,将数组分为两个子数组,小于基准的位于左子数组,大于基准的位于右子数组,然后递归地对左右子数组进行排序,最后合并两个子数组。

具体的实现方法有很多,我们举一个例子:

<pre>
def quick_sort(array):
    if len(array) <= 1:
        return array
    else:
        #选取基准元素
        pivot = array[0]
        #将小于基准的元素放到左边,大于基准的元素放到右边
        left = [x for x in array[1:] if x < pivot]
        right = [x for x in array[1:] if x >= pivot]
        #递归排序左右子数组
        return quick_sort(left) + [pivot] + quick_sort(right)
</pre>

二、算法优化

快速排序的平均时间复杂度为O(nlogn),是一种非常高效的排序算法。不过,在实际应用中,快排也有一些局限性:

1、如果已经排好序的数组会使递归树的深度达到O(n),时间复杂度变为O(n^2)。这种情况下,可以随机选取基准元素来避免。

2、在业务上,如果数组中有大量重复的元素,快排的效率会大大降低。这种情况下,可以选择三路快排算法。

我们来看看如何优化快速排序算法:

1、随机选取基准元素

可以通过random模块来随机选取基准元素,代码如下:

<pre>
import random

def quick_sort(array):
    if len(array) <= 1:
        return array
    else:
        #随机选取基准元素
        index = random.randint(0, len(array) - 1)
        pivot = array[index]
        #将小于基准的元素放到左边,大于基准的元素放到右边
        left = [x for x in array[:index] + array[index+1:] if x < pivot]
        right = [x for x in array[:index] + array[index+1:] if x >= pivot]
        #递归排序左右子数组
        return quick_sort(left) + [pivot] + quick_sort(right)
</pre>

2、三路快排

三路快排算法是对快速排序算法的一种优化,主要应用于处理有大量重复元素的数组。它不但能减少递归深度,也能减少时间复杂度。

思路是将数组分为小于、等于、大于基准元素的三个区间,然后递归对小于和大于的部分继续进行三路快排,以此类推。

<pre>
def quick_sort_3w(array):
    if len(array) <= 1:
        return array
    else:
        #选取基准元素
        pivot = array[0]
        lt = [x for x in array if x < pivot] #小于基准元素的数组
        eq = [x for x in array if x == pivot] #等于基准元素的数组
        gt = [x for x in array if x > pivot] #大于基准元素的数组
        #递归排序三个子数组
        return quick_sort_3w(lt) + eq + quick_sort_3w(gt)
</pre>

三、算法实现

现在,我们可以来实现一个完整的快速排序算法,在实现过程中可以选择以上两种优化算法。

<pre>
import random

def quick_sort(array):
    if len(array) <= 1:
        return array
    else:
        #随机选取基准元素
        index = random.randint(0, len(array) - 1)
        pivot = array[index]
        #将小于基准的元素放到左边,大于基准的元素放到右边
        left = [x for x in array[:index] + array[index+1:] if x < pivot]
        right = [x for x in array[:index] + array[index+1:] if x >= pivot]
        #递归排序左右子数组
        return quick_sort(left) + [pivot] + quick_sort(right)

def quick_sort_3w(array):
    if len(array) <= 1:
        return array
    else:
        #选取基准元素
        pivot = array[0]
        lt = [x for x in array if x < pivot] #小于基准元素的数组
        eq = [x for x in array if x == pivot] #等于基准元素的数组
        gt = [x for x in array if x > pivot] #大于基准元素的数组
        #递归排序三个子数组
        return quick_sort_3w(lt) + eq + quick_sort_3w(gt)
</pre>

四、总结

快速排序是一种常用的高效排序算法,一般情况下优于冒泡排序、插入排序、选择排序等算法。

快速排序的基本思路是分治法,通过递归将数组分为两个子数组进行排序,最后合并。

如果数组中有大量重复元素,可以采用三路快排算法进行优化。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/185957.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-26 21:08
下一篇 2024-11-26 21:08

相关推荐

  • Ojlat:一款快速开发Web应用程序的框架

    Ojlat是一款用于快速开发Web应用程序的框架。它的主要特点是高效、易用、可扩展且功能齐全。通过Ojlat,开发人员可以轻松地构建出高质量的Web应用程序。本文将从多个方面对Oj…

    编程 2025-04-29
  • Python导入数组

    本文将为您详细阐述Python导入数组的方法、优势、适用场景等方面,并附上代码示例。 一、numpy库的使用 numpy是Python中一个强大的数学库,其中提供了非常丰富的数学函…

    编程 2025-04-29
  • Python简单数学计算

    本文将从多个方面介绍Python的简单数学计算,包括基础运算符、函数、库以及实际应用场景。 一、基础运算符 Python提供了基础的算术运算符,包括加(+)、减(-)、乘(*)、除…

    编程 2025-04-29
  • Python返回数组:一次性搞定多种数据类型

    Python是一种多用途的高级编程语言,具有高效性和易读性的特点,因此被广泛应用于数据科学、机器学习、Web开发、游戏开发等各个领域。其中,Python返回数组也是一项非常强大的功…

    编程 2025-04-29
  • Python满天星代码:让编程变得更加简单

    本文将从多个方面详细阐述Python满天星代码,为大家介绍它的优点以及如何在编程中使用。无论是刚刚接触编程还是资深程序员,都能从中获得一定的收获。 一、简介 Python满天星代码…

    编程 2025-04-29
  • Python去掉数组的中括号

    在Python中,被中括号包裹的数据结构是列表,列表是Python中非常常见的数据类型之一。但是,有些时候我们需要将列表展开成一维的数组,并且去掉中括号。本文将为大家详细介绍如何用…

    编程 2025-04-29
  • Python操作数组

    本文将从多个方面详细介绍如何使用Python操作5个数组成的列表。 一、数组的定义 数组是一种用于存储相同类型数据的数据结构。Python中的数组是通过列表来实现的,列表中可以存放…

    编程 2025-04-29
  • Python海龟代码简单画图

    本文将介绍如何使用Python的海龟库进行简单画图,并提供相关示例代码。 一、基础用法 使用Python的海龟库,我们可以控制一个小海龟在窗口中移动,并利用它的“画笔”在窗口中绘制…

    编程 2025-04-29
  • Python二维数组对齐输出

    本文将从多个方面详细阐述Python二维数组对齐输出的方法与技巧。 一、格式化输出 Python中提供了格式化输出的方法,可以对输出的字符串进行格式化处理。 names = [‘A…

    编程 2025-04-29
  • 二阶快速求逆矩阵

    快速求逆矩阵是数学中的一个重要问题,特别是对于线性代数中的矩阵求逆运算,如果使用普通的求逆矩阵方法,时间复杂度为O(n^3),计算量非常大。因此,在实际应用中需要使用更高效的算法。…

    编程 2025-04-28

发表回复

登录后才能评论