Python排序算法:快速实现数据集排序

在现代计算机领域中,排序算法是非常重要的一种基础算法。排序算法是将一组无序的元素以某种规则按相应的顺序排列的过程。快速排序算法是一种相对高效的排序方法,可以在O(NlogN)的时间复杂度内完成排序,但是在处理大型数据集时比较吃紧,因为它的空间复杂度为O(N),而N值较大时,空间开销会变得很大。

一、快速排序算法概述

快速排序算法是一种排序方式,选定一个基准(pivot)值,按照基准值将元素分成两个子序列,其中一个序列比基准值小,一个序列比基准值大,然后递归地继续进行排序,最后将两个子序列合并成一个有序序列。

二、快速排序算法实现

下面是一个实现快速排序算法的Python示例代码:

def quick_sort(array):
    if len(array) < 2:
        return array
    else:
        pivot = array[0]
        less = [i for i in array[1:] if i  pivot]
        return quick_sort(less) + [pivot] + quick_sort(greater)

array = [56, 23, 89, 11, 7, 35, 12, 5, 67]
sorted_array = quick_sort(array)
print(sorted_array)

在上面的代码中,我们首先检查数组是否只有一个或零个元素,如果是,直接返回数组。然后选取数组中的第一个元素作为基准,将小于等于基准的元素放在一个列表中,将大于基准的元素放在另一个列表中,最后递归地调用quick_sort()函数对两个子序列进行排序,并将它们与基准值拼接在一起,返回一个有序的数组。

三、快速排序算法优化

1、选择更优的基准

快速排序的时间复杂度是由选择基准的方式所决定的。如果选取的基准恰好是数组中最小(或最大)的值,那么快速排序算法的复杂度将达到O(N²)。因此,可以通过随机选取基准的方式来避免这种情况的发生,或者通过取数组中三个数的中位数作为基准,来确保分割较为平均,从而达到更优的效果。

下面是一个随机选取基准的Python代码示例:

import random

def quick_sort(array):
    if len(array) < 2:
        return array
    else:
        # 随机选取基准
        index = random.randint(0, len(array)-1)
        pivot = array[index]
        less = [i for i in array[:index]+array[index+1:] if i  pivot]
        return quick_sort(less) + [pivot] + quick_sort(greater)

array = [56, 23, 89, 11, 7, 35, 12, 5, 67]
sorted_array = quick_sort(array)
print(sorted_array)

2、优化递归深度

在大型数据集上运行快速排序算法时,递归深度可能会非常大,而Python的默认递归深度是1000,如果超过这个深度,会引发递归调用栈溢出的异常。为了解决这种问题,可以通过使用非递归的实现方式,或者使用尾递归的方式来进行优化。

下面是一个尾递归实现方式的Python代码示例:

def quick_sort(array, left=0, right=None):
    if right is None:
        right = len(array) - 1
    if left >= right:
        return
    pivot = array[left]
    i, j = left, right
    while i < j:
        while i  pivot:
            j -= 1
        array[i] = array[j]
        while i < j and array[i] <= pivot:
            i += 1
        array[j] = array[i]
    array[i] = pivot
    quick_sort(array, left, i - 1)
    quick_sort(array, i + 1, right)

array = [56, 23, 89, 11, 7, 35, 12, 5, 67]
quick_sort(array)
print(array)

在上面的代码中,我们首先将left和right作为参数传递给quick_sort()函数,并将right的默认值设置为数组长度-1。然后我们遍历数组,选取array[left]作为基准,将i和j初始化为left和right,对整个数组进行遍历,将比基准大的元素移动到右边,比基准小的元素移动到左边。最后我们对左右两边的子序列进行递归调用,并将结果拼接在一起,得到最终的有序数组。

四、总结

快速排序算法是一个非常有效的排序算法,它的时间复杂度是O(NlogN),但是也需要注意到它的空间开销。如果使用随机选取基准和尾递归的方式进行优化,可以使得快速排序算法在处理大型数据集时更为高效。

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-07 17:49
下一篇 2024-12-07 17:49

相关推荐

  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29

发表回复

登录后才能评论