基于比较的的排序

toaday I'm going to review some important sorting algorithms based on comparison.besides,related data structures such as heap ,will also be talked.

1.1 堆排序
1.2 选择排序,插入排序,冒泡排序
1.3 快速排序
1.4 相关笔试题分析

1.1 堆排序

1.1.1 什么是堆?    what and why?
1.1.2 堆的实现?什么二叉堆?   
1.1.3 堆的相关操作?  
1.1.4 堆与优先队列的关系? 优先队列 what and why?
1.1.5 如何利用堆进行堆排序 ? 
1.1.6 堆的优缺点? 堆排序分析.  
1.1.7 References & Externel Links
1.1.1 什么是堆?Heap?
1.1.1.1 what?

很多人以为
堆 == 二叉堆 == 优先队列 他们之间的关系真的是相等的吗?

在英语中,heap作为动词 把..堆起/使成堆 的意思。作为名词是堆/很多的意思。
1964年,J. W. J. Williams 发明了堆排序(Heap Sort)[1],同时描述了如何利用二叉堆来实现一个优先队列。 使用该种数据结构可以高效的获取队列中的最大值或者最小值,从而进行排序操作。
(关于二叉堆见1.1.2,什么是优先队列见1.1.4 )

之后,后人不断加以改进,产生了一系列不同的堆.
比如k-叉堆,斐波那契堆,二项堆,左式堆,斜堆等等。 见堆变体

从最初William的二叉堆用于堆排序,到后来的各式各样的堆,基本都是以树的形式表示。因此说

堆是一共基于树的数据结构

维基百科也有说:A heap is a specialized tree-based data structure that satisfies the heap property。
所谓的heap property(堆的性质)即是大根堆/小跟堆的性质(所有父节点≥/≤子节点)。

因此,亦可以说堆不是一个数据结构,而是一类数据结构[this is my personal opinion]。

1.1.1.2 关于二叉堆 Binary Heap

二叉堆是一种堆

维基百科上说:
A binary heap is a heap data structure that takes the form of a binary tree. Binary heaps are a common way of implementing priority queues.[2]

显而易见的,将堆与二叉堆划等号(堆heap == 二叉堆bianry heap),显然是一个不成熟的想法。

heap != bianry heap,that is to say , heap is a class of data structures.but binay heap is a common type of heap.

它们与优先队列的关系将会在1.1.4中简要探讨。

1.1.1.3 why ?

既然知道了什么是堆,那么为什么要用堆呢?williams为什么要引入它呢。它又有哪些优点呢。
我认为,对于传统的大根堆或者小跟堆而言,最大值/最小值分别处于root节点位置.(为什么?)
这方便我们从中读/取最大值,最小值,这是一个O(logn)的操作。相对于数组而言,这有显著的性能提升。因此堆适用于那些需要频繁取最大/最小值的应用。

1.1.2 堆的实现?什么二叉堆?

堆采用树结构实现。对于不同的堆有不同的树实现。

1.1.2.0 什么是二叉堆

二叉堆是一种堆,二叉堆广泛地被使用,以至于,当我们谈论堆时,通常默认指的就是二叉堆。
二叉堆也是优先队列的一种常见的实现。 (什么是优先队列见1.1.4 )

二叉堆基于二叉树是实现,除了是二叉树之外,还需要满足下面两个条件。
1.Shape property :一个二叉堆是一个完全二叉树。在此含义即是所有的层(除了最后一层)都是满的,只有最后一层不是满的,而且最后一层的节点从左向右依次填充。
2.Heap property: (大根堆)对于所有的父亲节点而言,其值≥子节点。
(小根堆)对于所有的父亲节点而言,其值≤ 子节点。 【注意可以等于】

1.1.2.1 二叉堆的实现

对于最常见的二叉堆:
他使用二叉树来实现,这个二叉树是一个完全二叉树(完全二叉树在不同的文献中有着不同的含义,在此处我们取所有的层(除了最后一层)都是满的,只有最后一层不是满的,而且最后一层的节点从左向右依次填充。见维基百科-完全二叉树)

逻辑上,二叉堆是一棵树。 物理上,二叉堆常用数组来实现。而不需要指针。这样可以获得较好的性能。(考虑为什么可以?)

如下图所示:
逻辑结构:

image

物理结构:
image

1.1.2.2 斐波那契堆的实现
1.1.2.3 二项堆堆的实现

1.1.3 堆的相关操作?

对于不同的heap,我们有不同的操作,在此,我们先对最为广泛的二叉堆进行阐述。
【本部分主要采自算法导论第三版 && 只针对大根堆(小根同理)】
【注:大根堆 == 最大堆,小根堆 == 最小堆】

  • Max-Heapify 维护大根堆的性质。O(log n)
  • Build-Max-Heap 从无序的输入数据数组中构造一个大根堆。 O(n)
  • HeapSort O(nlog n ) 对一个数组进行[原址]排序。
  • Max-Heap-Insert,Heap-Extract-Max,Heap-Increase-Key,Heap-Maximum【O(1)】过程、时间复杂度均为O(log n )功能是利用二叉堆实现一个优先队列。

【此处只是列出了算法伪代码以及算法思想,比较晦涩,最好还是找到具体的例子(譬如算法导论上就可以找到),配合算法,会有更加深刻的理解,此处限于篇幅就不做举例了】

1.1.3.1 Max-Heapify

Max-Heapify(A,i) 自顶向下维护大根堆性质。 O(log n)

image

1.1.3.2 Build-Max-Heap

Build-Max-Heap(A) 从最后一个非叶子节点开始,到根节点一次调用Max-Heapify(A,i)

image

【此算法的复杂度是O(n) 而不是O(n log n)试想为什么?】【算法导论上有证明】

1.1.3.3 HeapSort

HeapSort(A) O(n log n )
思想:
每次从root节点取出最大值,然后调整。
即:
从最后一个节点开始,将其调换A[1]](最大值),将脱离堆,从根节点开始调整堆。

image

1.1.3.4 优先队列の操作

Max-Heap-Insert,Heap-Extract-Max,Heap-Increase-Key,Heap-Maximum【O(1)】过程、时间复杂度均为O(log n )功能是利用二叉堆实现一个优先队列。
these operations are implemented to implement a priority queue.
the operations above ,i.e. Max-Heapify,Build-Max-Heap ,HeapSort are enough for heapsort.

  • Max-Heap-Insert,在大根堆中插入一个元素并调整之
  • Heap-Extract-Max,取出最大值即根节点,然后调整之
  • Heap-Increase-Key,将某个节点增加一定的值,然后调整之
  • Heap-Maximum,返回根节点的值

1.1.4堆与优先队列的关系? 优先队列what and why?

1.1.5 如何利用堆进行堆排序 ?

1.1.6 堆的优缺点? 堆排序分析.

1.1.7 References & Externel Links

1.2 选择排序,插入排序,冒泡排序

1.3 快速排序

1.4

[1] : Williams, J. W. J. (1964), "Algorithm 232 - Heapsort", Communications of the ACM, 7 (6): 347–348

[2] :https://en.wikipedia.org/wiki/Binary_heap

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

推荐阅读更多精彩内容