图解算法学习笔记(四):快速排序

目录

1) 示例1:

2)快速排序

3) 再谈大O表示法

4)小结


本章内容:学习分而治之,快速排序

1) 示例1:

假设你是农场主,有一小块土地,你要将这块地均匀分成方块,且分出的方块尽可能大。如何分?

你要将这块地均匀分成方块,且分出的方块要尽可能大。显然,下面的分法不符合要求。

此时,你应该使用D&C策略(divide and conquer)。包括两步骤:

(1) 找出基线条件,这种条件必须尽可能简单。

(2)不断将问题分解(或者说缩小规模),直到符合基线条件。

下面就来使用D&C找出问题的解决方案。首先,找出基线条件。最容易处理的情况是,一条边的长度是另一边的整数倍。

现在找出递归条件,这正是D&C的用武之地。每次递归都必须缩小问题的规模,如何缩小问题的规模呢,首先,找出这块地可容纳的最大方块。

如图,划出了两个方块,同时余下一小块地。现在是顿悟时刻,何不对余下的那一小块地使用相同的算法呢?

这里有一个关键的地方,就是适用于这小快地的最大方块,也是适用于整块地的最大方案。感兴趣的可以查查欧几里得算法。

https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/the-euclidean-algorithm

接下来就是使用同样算法。直到余下土地为方块。

           

      

现在我们找到了最大方块,如下图:

2)快速排序

快速排序是一种常用的排序算法,比选择排序快得多,例如,C语言标准库的函数qsort实现的就是快速排序。

对排序算法来说,最简单的数组什么样呢?就是根本不需要排序的数据。

因此,基线条件为数组为空或只包含一个元素。在这种情况,只需返回数组:

def quicksort(array):if len(array) < 2:return array

我们来看更长的数组。对包含两个元素的数组进行排序也很容易:

包含三个元素呢?

现在介绍快速排序的工作原理:首先,从数组中选择一个元素,这个元素被称为基准值(pivot).

我们暂时将数组的第一个元素用作基准值.接下来,找出比基准值小的元素以及比基准值大的元素。

这被称为分区(partitioning)。这里只进行了分区,得到的两个子数组是无序的。如何对子数组进行排序呢?对于包含两个元素的数组以及空数组,快速排序知道如何将它们排序。因此对这两个子数组进行快速排序,再合并结果,就得到一个有序数组!

quicksort([15, 10]) + [33] + quicksort([])
> [10, 15, 33]

现在我们知道了如何对包含三个元素的数组进行排序了:

(1)选准基准值。

(2)将数组分成两个子数组:小于基准值的元素和大于基准值的元素。

(3)对这两个子数组进行快速排序。

下面是快速排序的代码:

def quicksort(array):if len(array) < 2:return arrayelse:pivot = array[0]less = [i for i in array if i<= pivot]greater = [i for in array if i > pivot]return quicksort(less) + [pivot] + quicksort(greater)

 

3) 再谈大O表示法

我们再来看看常见的大O运行时间:

这里需要说明的是,在平均情况下,快速排序的运行时间为O(n logn)。

快速排序的性能高度依赖于你选择的基准值。来看下面这样一个有序数组,每次都选择第一个元素为基准值,来看看快速排序过程,

现在选择中间元素作为基准值,看看排序过程:

第一个示例展示的是最糟情况,栈长为O(n),第二个示例展示的是最佳情况,栈长为O(log n)。与此同时,在调用栈的每层都涉及全部8个元素,操作数为O(n)。

现在可以得出快速排序的运行时间为O(n logn)(最佳情况),最佳情况也是平均情况。

4)小结

  • D&C将问题逐步分解,使用D&C处理列表时,基线条件很可能是空数组或只包含一个元素的数组;
  • 实现快速排序时,请随机选地选择用做基准值的元素,快速排序的平均运行时间为O(n log n);
  • 大O表示法中的常量有时候事关重大,这就是快速排序比合并排序快的原因所在;
  • 比较简单查找和二分查找时,常量几乎无关紧要,因为列表很长时,O(log n)的速度为O(n)块很多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图解算法学习笔记(五):散列表

目录 1&#xff09;示例1&#xff1a; 2&#xff09;散列函数 3&#xff09;应用案例 4&#xff09;冲突 5&#xff09;性能 6&#xff09;小结 本章内容&#xff1a; 学习散列表&#xff0c;最有用的数据结构之一。 学习散列表的内部机制&#xff1a;实现、冲突和散列函…

图解算法学习笔记(六):广度优先搜索

目录 1&#xff09;图简介 2&#xff09;图是什么 3&#xff09;广度优先搜索 4&#xff09;实现图 5&#xff09;实现算法 6&#xff09;小结 本章内容; 学习使用新的数据结构图来建立网络模型&#xff1b; 学习广度优先搜索&#xff1b; 学习有向图和无向图…

图解算法学习笔记(七):狄克斯特拉算法

目录 1&#xff09;使用狄克斯特拉算法 2&#xff09;术语 3&#xff09;实现 4&#xff09;小结 本章内容; 介绍加权图&#xff0c;提高或降低某些边的权重&#xff1b; 介绍狄克斯特拉算法&#xff0c;找出加权图中前往X的最短路径&#xff1b; 介绍图中的环…

【HDU - 5477】A Sweet Journey(思维,水题)

题干&#xff1a; Master Di plans to take his girlfriend for a travel by bike. Their journey, which can be seen as a line segment of length L, is a road of swamps and flats. In the swamp, it takes A point strengths per meter for Master Di to ride; In the f…

图解算法学习笔记(八):贪婪算法

目录 &#xff08;1&#xff09;背包问题 &#xff08;2&#xff09;集合覆盖问题 &#xff08;3&#xff09;NP完全问题 &#xff08;4&#xff09;小结 本章内容&#xff1a; 学习如何处理没有快速算法的问题&#xff08;NP完全问题&#xff09;。学习近似算法&#xff…

图解算法学习笔记(九):动态规划

目录 &#xff08;1&#xff09;背包问题 &#xff08;2&#xff09;最长公共子串 &#xff08;3&#xff09;小结 本章内容&#xff1a; 学习动态规划&#xff0c;它将问题分成小问题&#xff0c;并先着手解决这些小问题。学习如何设计问题的动态规划解决方案。 &#xff…

Java(win10安装jdk,第一个hello world)

Java 第一步 &#xff1a;安装jdk 推荐默认安装。&#xff08;安装到C盘&#xff09;第二步 &#xff1a;配置jdk环境 JAVA_HOME C:\Program Files\Java\jdk1.8.0_191 JDK的安装路径 Path&#xff1a; C:\Program Files\Java\jdk1.8.0_191\bin JDK下bin目录的路径 &#xf…

#pragma 详解

#pragma 求助编辑 pragma - 必应词典美[prɡmə]英[prɡmə]n.〔计〕杂注网络编译指示&#xff1b;显示编译指示&#xff1b;特殊指令 百科名片 在所有的预处理指令中&#xff0c;#Pragma 指令可能是最复杂的了&#xff0c;它的作用是设定编译器的状态或者是指示编译器完成一些…

1.绪论

目录 &#xff08;1&#xff09;C语言传值与传地址变量 &#xff08;2&#xff09;算法效率的度量 &#xff08;3&#xff09;基本操作 &#xff08;4&#xff09;主函数 主要由实现基本操作和算法的程序构成。这些程序有6类&#xff1a; 数据存储结构&#xff0c;文件名第…

(ECC)椭圆曲线加密算法原理和C++实现源码

目录 &#xff08;1&#xff09;ECC加密原理&#xff1a; &#xff08;2&#xff09;编译生成LibTommath静态库 &#xff08;3&#xff09;ECC源码 今天介绍一下利用LibTommath数学库实现椭圆曲线加密算法的原理和源码。 &#xff08;1&#xff09;ECC加密原理&#xff1a;…

【POJ - 2553】The Bottom of a Graph(tarjan强连通分量缩点,模板题)

题干&#xff1a; We will use the following (standard) definitions from graph theory. Let V be a nonempty and finite set, its elements being called vertices (or nodes). Let E be a subset of the Cartesian product VV, its elements being called edges. Then G(…

机器学习笔记(1):Introduction

目录 1&#xff09;welcome 2&#xff09;What is Machine Learning 3&#xff09;Supervised Learning 4&#xff09;Unsupervised Learning 1&#xff09;welcome 第一个视频主要介绍了机器学习目前的案例&#xff0c;主要有&#xff1a;数据库挖掘、医疗记录、生物工程…

【POJ - 3352】Road Construction(Tarjan,边双连通分量)

题干&#xff1a; Its almost summer time, and that means that its almost summer construction time! This year, the good people who are in charge of the roads on the tropical island paradise of Remote Island would like to repair and upgrade the various roads…

机器学习简易入门-附推荐学习资料

目录 &#xff08;1&#xff09;机器学习正规学习路线 &#xff08;2&#xff09;机器学习快速入门 &#xff08;3&#xff09;总结 感谢黄海广博士的分享 原创&#xff1a; 机器学习初学者 机器学习初学者 今天 机器学习如何入门&#xff1f;目前没有明确的答案。本站面向…

C++11中的std::function

原文地址&#xff1a;http://www.jellythink.com/archives/771 看看这段代码 先来看看下面这两行代码&#xff1a; std::function<void(EventKeyboard::KeyCode, Event*)> onKeyPressed; std::function<void(EventKeyboard::KeyCode, Event*)> onKeyReleased; 这两…

【HDU - 3394】Railway(点双连通分量,Tarjan算法,思维tricks)

题干&#xff1a; There are some locations in a park, and some of them are connected by roads. The park manger needs to build some railways along the roads, and he would like to arrange tourist routes to each circuit. If a railway belongs to more than one …

飞机大战(简易版)

一、游戏分析 飞机大战中的主要“角色”有&#xff1a; 1.英雄 2.敌方飞机 3.英雄发射的子弹 我们需要控制的有&#xff1a; 1.绘制屏幕内的角色 2.控制角色的逻辑&#xff0c;比如&#xff1a;敌方飞机与我方飞机的碰撞检测&#xff0c;我方飞机发射的子弹与敌方飞机之间的碰撞…

在Ubuntu上安装Keras深度学习框架

目录 1&#xff09;安装pip 2&#xff09;安装Python科学套件 3&#xff09;安装TensorFlow 4&#xff09;安装keras 5&#xff09;安装Jupyter Notebook 6&#xff09;运行Keras 本文介绍如何在Ubuntu上安装Keras深度学习框架。 1&#xff09;安装pip 安装pip包&#…

【POJ - 1523】SPF(Tarjan求割点,求分割成的连通块数,模板题,tricks)

题干&#xff1a; Consider the two networks shown below. Assuming that data moves around these networks only between directly connected nodes on a peer-to-peer basis, a failure of a single node, 3, in the network on the left would prevent some of the still…

机器学习笔记(2):单变量线性回归

目录 1&#xff09;Model representation 2&#xff09;Cost function 3&#xff09;Cost function intuition 1 4&#xff09;Cost function intuition2 5&#xff09;Gradient descent 6&#xff09;Gradient descent intuition 7&#xff09;Gradient descent for li…