python快速排序代码实例

Python 快速排序 (Quick Sort) 是一种排序算法,它利用分治思想来快速排序一个数组或序列。该算法的时间复杂度为 O(nlogn)。

要理解快速排序算法,我们需要掌握以下概念:

  • 基准值 (pivot):排序过程中用于比较的值。在每一轮的排序过程中,基准值会将数组或序列分成两部分。
  • 子数组 (subarray):对于一个数组或序列,它的一部分就是一个子数组。在快排中,子数组的划分是对基准值的判断和比较得出的。

快速排序的实现步骤

以下是快速排序算法的实现步骤:

  1. 选取基准值 pivot,一般取数组的第一个元素或者随机数。
  2. 将数组或序列分成小于等于和大于等于基准值的两个子数组 subarrayLeft 和 subarrayRight,并将基准值放在它们中间。
  3. 对 subarrayLeft 和 subarrayRight 分别递归快排。
  4. 递归出口是子数组的长度为 0 或 1。

Python 代码示例

下面给出一个 Python 的快速排序代码实例:

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

    pivot = arr[0]
    subarrayLeft = []
    subarrayRight = []

    for i in arr[1:]:
        if i <= pivot:
            subarrayLeft.append(i)
        else:
            subarrayRight.append(i)

    return quicksort(subarrayLeft) + [pivot] + quicksort(subarrayRight)

该代码实现的是递归快速排序。函数传入一个数组,如果长度小于等于 1 就直接返回该数组,否则选取第一个元素作为基准值,并将数组分成左右两部分,然后分别对左右两部分递归快排。

arr = [3, 2, 1, 5, 4]
print(quicksort(arr))  # [1, 2, 3, 4, 5]

对于上面的示例代码,如果输入的数组是 [3, 2, 1, 5, 4],输出结果将是 [1, 2, 3, 4, 5]。

另外,我们还可以实现原地快速排序。以下是 Python 原地快速排序代码示例:

def quicksortInPlace(arr):
    def partition(left, right):
        pivot = arr[right]
        i = left - 1

        for j in range(left, right):
            if arr[j] <= pivot:
                i += 1
                arr[i], arr[j] = arr[j], arr[i]

        arr[i + 1], arr[right] = arr[right], arr[i + 1]
        return i + 1

    def _quicksort(left, right):
        if left < right:
            pivotIndex = partition(left, right)
            _quicksort(left, pivotIndex - 1)
            _quicksort(pivotIndex + 1, right)

    _quicksort(0, len(arr) - 1)
    return arr

该代码实现的是原地快速排序。我们传入一个数组,然后定义 partition 函数来进行分区,该函数使用 right 作为基准值 pivot,并返回 pivot 的最终索引。在快速排序的整个过程中,比 pivot 小的数放在数组的左侧,比 pivot 大的数放在数组的右侧。

arr = [3, 2, 1, 5, 4]
quicksortInPlace(arr)
print(arr)  # [1, 2, 3, 4, 5]

对于上面的示例代码,如果输入的数组是 [3, 2, 1, 5, 4],程序会直接通过原地排序修改原数组,输出结果将是 [1, 2, 3, 4, 5]。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python快速排序代码实例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • PHP有序表查找之二分查找(折半查找)算法示例

    下面我将对“PHP有序表查找之二分查找(折半查找)算法示例”的完整攻略进行详细讲解。 一、什么是二分查找 二分查找又称为折半查找,是一种在有序数组中查找某一特定元素的搜索算法。基本思想是:将有序数组分成两部分,如果要查找的元素比数组中间的元素小,则在左半部分继续查找;如果要查找的元素比数组中间的元素大,则在右半部分继续查找,直到找到或者查找结束。 二分查找算…

    算法与数据结构 2023年5月19日
    00
  • PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】

    PHP四种排序算法实现及效率分析 本文将介绍 PHP 中的四种常用排序算法,这四种算法分别是冒泡排序、插入排序、选择排序和快速排序。我们会详细讲解它们的思路、实现方式和效率分析,并对比它们的优缺点,让读者可以更好地理解和运用它们。 冒泡排序 冒泡排序是最基本、最简单的排序算法,其核心思想是从左往右依次比较相邻的两个元素,如果前面的元素比后面的元素大,则交换两…

    算法与数据结构 2023年5月19日
    00
  • C语言每日练习之选择排序

    C语言每日练习之选择排序 选择排序算法简介 选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思路是在未排序的数列中,从前往后依次选择最小的数,和第一个数进行交换,然后在剩余的数列中从前往后选择最小的数,与第二个数进行交换,直到选择到最后一个数为止。 选择排序的时间复杂度为O(n²),属于较慢的排序算法,但是它的实现简单易懂,不需要额…

    算法与数据结构 2023年5月19日
    00
  • 前端JavaScript多数元素的算法详解

    前端JavaScript多数元素的算法详解 算法介绍 多数元素在一个数组中出现次数超过一半的元素,因此要找到多数元素,需要考虑其出现次数是否超过了数组长度的一半。本文介绍三种常见的多数元素算法,分别为排序法、哈希表法和摩尔投票法。 排序法 排序法的思路是先对数组进行排序,然后返回数组中间的那个元素即可。由于多数元素出现次数超过了数组长度的一半,因此排序后中间…

    算法与数据结构 2023年5月19日
    00
  • C++归并排序算法详解

    C++归并排序算法详解 什么是归并排序 归并排序是一种基于“分治思想”的排序算法,它将待排序的数组不断分割成若干个子数组,直到每个子数组中只有一个元素。然后将那些只有一个元素的子数组归并成两个元素有序的子数组;接着将两个元素有序的子数组再次归并成四个元素有序的子数组;依次类推,直到归并为一个完整的排序数组。 归并排序的流程 1.分解:将待排序的数组从中间分割…

    算法与数据结构 2023年5月19日
    00
  • c++中八大排序算法

    c++中八大排序算法 本文介绍的是C++中八大排序算法,分别是冒泡排序、选择排序、插入排序、快速排序、希尔排序、归并排序、堆排序和计数排序。下面将对这八种算法进行详细讲解。 冒泡排序 冒泡排序(Bubble Sort),是一种简单的排序算法。它重复地遍历要排序的列表,比较每对相邻的项,如果它们的顺序错误就把它们交换过来。遍历列表的工作是重复地进行知道没有再需…

    算法与数据结构 2023年5月19日
    00
  • 归并排序时间复杂度过程推导详解

    归并排序时间复杂度过程推导详解 什么是归并排序 归并排序是一种基于分治思想的排序算法,将一个无序的数组划分成若干子数组,对每个子数组进行排序,然后再将排好序的子数组进行合并,最终得到一个完整有序的数组。 归并排序的时间复杂度 归并排序的时间复杂度是O(nlogn),其中n表示数组的长度。接下来我们将详细讲解归并排序的时间复杂度推导过程。 假设有一个长度为n的…

    算法与数据结构 2023年5月19日
    00
  • C++超详细分析优化排序算法之堆排序

    C++超详细分析优化排序算法之堆排序 堆排序算法的思路 堆排序算法是一种树形选择排序算法。它的基本思想是:将待排序的序列构造成一个大根堆(或小根堆),此时,整个序列的最大(或最小)值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大(或最小)值),然后将剩余的n-1个序列重新构造成一个堆,这样,每次找出最大(或最小)值的操作…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部