IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法设计与分析——排序算法(七):快速排序-[基础知识] -> 正文阅读

[数据结构与算法]算法设计与分析——排序算法(七):快速排序-[基础知识]

对于包含 n n n个数的输入数组来说,快速排序是一种最坏情况时间复杂度为 Θ ( n 2 ) \Theta(n^2) Θ(n2)的排序算法。虽然最坏情况时间复杂度很差,但是快速排序通常是实际排序应用中最好的选择,因为它的平均性能非常好:它的期望时间复杂度是 O ( n lg ? n ) O(n\lg n) O(nlgn),而且 O ( n lg ? n ) O(n\lg n) O(nlgn)中隐含的常数因子非常小。另外,它还能够进行原址排序,甚至在虚存环境中也能很好地工作。

《排序算法(七):快速排序-[基础知识]》将描述快速排序算法及它的一个重要的划分子程序。因为快速排序的运行情况比较复杂,在《排序算法(七):快速排序-[快速排序的性能]》中,我们先对其性能进行一个直观的讨论,在《快速排序》系列文章的最后会给出一个准确的分析。在《排序算法(七):快速排序-[快速排序的随机化版本]》中,我们会介绍一个基于随机抽样的快速排序算法。这一算法的期望时间复杂度较好,而且没有什么特殊的输入会导致最坏情况的发生。《排序算法(七):快速排序-[分析快速排序]》对这一随机算法的分析表明,其最坏情况时间复杂度是 Θ ( n 2 ) \Theta(n^2) Θ(n2),在元素互异的情况下,期望时间复杂度 O ( n lg ? n ) O(n\lg n) O(nlgn)

与归并排序一样,快速排序也使用了《分治策略(一):基础知识》介绍的分治思想。下面是对一个典型的子数组A【p门进行快速排序的三步分治过程:

  • 分解:数组 A [ p ? r ] A[p\cdots r] A[p?r]被划分为两个(可能为空)子数组 A [ p ? q ? 1 ] A[p\cdots q-1] A[p?q?1] A [ q + 1 ? r ] A[q+1\cdots r] A[q+1?r],使得 A [ p ? q ? 1 ] A[p\cdots q-1] A[p?q?1]中的每一个元素都小于等于 A [ q ] A[q] A[q],而 A [ q ] A[q] A[q]也小于等于 A [ q + 1 ? r ] A[q+1\cdots r] A[q+1?r]中的每个元素。其中,计算下标 q q q也是划分过程的一部分。
  • 解决:通过递归调用快速排序,对子数组 A [ p ? q ? 1 ] A[p\cdots q-1] A[p?q?1] A [ q + 1 ? r ] A[q+1\cdots r] A[q+1?r]进行排序。
  • 合并:因为子数组都是原址排序的,所以不需要合并操作:数组 A [ p ? r ] A[p\cdots r] A[p?r]已经有序。

下面的程序实现快速排序:

def partition(arr,low,high): 
    i = low-1
    pivot = arr[high]     
    for j in range(low, high): 
        if arr[j] <= pivot: 
            i = i+1 
            arr[i],arr[j] = arr[j],arr[i] 
    arr[i+1],arr[high] = arr[high],arr[i+1] 
    return i+1
# 快速排序函数
def quick_sort(arr,low,high): 
    if low < high: 
        pi = partition(arr,low,high) 
        quickSort(arr, low, pi-1) 
        quickSort(arr, pi+1, high) 

最后,我们用动图演示一下插入排序的全过程:
快速排序

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-23 16:56:46  更:2021-08-23 16:58:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:34:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码