算法小专栏:“D&C思想”与“快速排序”

级别: ★☆☆☆☆
标签:「算法」「D&C」「quickSort」
作者: MrLiuQ
审校: QiShare团队


前一篇介绍了递归与尾递归,本篇将基于递归介绍快速排序等相关内容。

阅读本文你将收获:

  • 分而治之思想:简称D&C,一种递归式解决问题方案。
  • 快速排序:利用D&C思想,实现的一种高效排序方法。

一、“分而治之”思想(D&C)

分而治之:(divide and conquerD&C)是一种著名的递归式解决问题的方法。

某一种解决问题的算法用处有限,而D&C为我们提供的是一种思路。
当我们面对一个复杂问题手足无措时,我们应该自问:“D&C能解决该问题么?”

那么,D&C是什么?

1.1 什么是D&C?

使用D&C解决问题的过程分为两个步骤:

  1. 找出基线条件,这个条件尽可能简单。(基线条件的定义见上篇
  2. 不断将问题分解(缩小规模),直到全部符合基线条件。

1.2 D&C的实例

场景:假设你是一位农场主,你有一块长方形(168m x 64m)的地。

问题:现在你需要把这块地分成若干个正方形的地(方便管理和种菜),问最大能拆分成多大的小正方形。(注意:不能留空地哦,最大利用土地资源)

  • 方案一:找出“长”和“宽”中,相同的最大的公约数即可。(我的第一反应是这样算)

  • 方案二:使用D&C思想,先从大长方形中去掉几个最大的正方形,再去掉小长方形的几个最大正方形,不断寻找,直到没有小长方形为止。

步骤:

  1. 找到基线条件:长是宽的整数倍
  2. 不断分解:去除所有最大正方形后,对小长方形进行分解

图解如图:

第一次:找到两个边长为64m的大正方形,去除后,留下64m x 40m的小长方形。

第二次:找到一个边长为40m的小正方形,去除后,留下40m x 24m的小长方形。

第三次:找到一个边长为24m的小正方形,去除后,留下24m x 16m的小长方形。

第四次:找到一个边长为16m的小正方形,取出后,留下16m x 8m的小长方形。

第五次:找到两个边长为8m的小正方形,正好分完。

因此,该农场分为小正方形田地的最大边长为8m。

而这个解决问题的思想,就是D&C思想。

我们再来回顾一下D&C思想的核心:

  • 找出简单的基线条件。
  • 确定如何缩小问题的规模,使其符合基线条件。

二、快速排序

快速排序(QuickSort)利用的就是D&C思想。它是一种高效的排序方案。

2.1 快排的思想(基于D&C)

  • 基线条件:当排序数组元素个数小于2个时,直接返回。
  • 缩小规模:每次从待排序数组中选取一个元素(基准值),把小于等于该元素的元素放在一侧,把大于该元素的元素放在另一侧。再对两边的小数组做重复操作。

2.2 快排的示例

基于Python,实现了一个快排:
代码如下:

def quickSort(arr):
    if len(arr) < 2:
        return arr
    else:
        pivot = arr[0]
        less = [i for i in arr[1:] if i <= pivot]
        greater = [i for i in arr[1:] if i > pivot]

        return quickSort(less) + [pivot] + quickSort(greater)

print quickSort([10, 2, 6, 4, 7, 2])

解读一下代码:

PS:基准值一般可以选取第一个元素,也可以选择最后一个元素。

2.3 快排的动画演示

本Demo中,选取的数组的最后一个元素为基准值,把小于等于基准值的元素放在左侧,大于基准值的元素放在右侧。


推荐文章:
iOS 避免常见崩溃(二)
算法小专栏:选择排序
iOS Runloop(一)
iOS 常用调试方法:LLDB命令
iOS 常用调试方法:断点
iOS 常用调试方法:静态分析
iOS 消息转发

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • 一、 单项选择题(共71题) 对n个元素的序列进行冒泡排序时,最少的比较次数是( )。A. n ...
    貝影阅读 8,889评论 0 10
  • 1. 关于诊断X线机准直器的作用,错误的是()。 (6.0 分) A. 显示照射野 B. 显示中心线 C. 屏蔽多...
    我们村我最帅阅读 10,147评论 0 5
  • 学习分而治之(divide and conquer, D&C)——快速排序 书中先讲了一个小案例,如果将一块长方形...
    天驱丶阅读 246评论 0 0
  • 我是谁? 一个处在迷茫期的女青年 生活工作一团糟的孤独者 爱哭爱闹爱笑爱疯的逗逼 安静文艺内向努力的学生 以上,都...
    六翎阅读 276评论 0 1
  • 多少次信誓旦旦的承诺,被生活收藏;多少次承诺的明天变成昨天。是生活先对我动了手,还是我根本就不懂得生活。 曾经,我...
    艾孤璟阅读 223评论 0 0