博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Heap,HeapSort,优先级队列
阅读量:5122 次
发布时间:2019-06-13

本文共 1807 字,大约阅读时间需要 6 分钟。

常用的排序算法属快速排序和堆排序应用的最多,快速排序的递归版本要受限制于栈空间溢出问题的困扰,无法处理大量数据排序(但是对于外存上的数据进行排序,什么排序算法猜算是适合的?也许mergeSort会是一种选择,但是这个要再考虑)。而其他的排序包括插入排序,归并排序,冒泡排序,选择排序,相较于这两种排序算法,或者在时间或者空间上消耗要更大。

HeapSort算法是一个就地的排序算法,时间复杂度和quickSort一样,为O(N*LogN),同时和快速排序一样,是不稳定的排序(貌似ShellSort,QuickSort,HeapSort这三种最高效的排序都是不稳定的,但是InsertSort,BubbleSort是稳定的)。并且在实现上,除了在保持堆结构的过程当中需要使用递归(由于是和深度有关的,所以递归的次数很少,而且应该是可以做尾递归优化的,是不是?),要了解堆排序首先要了解堆得定义。

Heap在计算机领域有两个主要的解释:

1.Heap是一种数据结构,在逻辑上为一颗完全二叉树,在物理上表现为一个数组。

2.Heap是一个程序执行空间当中的可动态申请的内存区域。

在堆排序当中,我们当然是选择第一种解释,堆的性质主要表现在如下的两个方面(以最大堆为例):

1.堆的任何一个节点的都要大于它的后裔

2.堆是一颗完全二叉树

 

如果把堆看成一种数据结构,那么对于定义抽象数据类型来说,堆的常用操作包括:

1.HeapIdf():保持堆得性质

2.BuildHeap():建立初始堆

3.Insert():插入新的元素进入堆

4.Update():更新堆元素的key并保持堆结构

5.get():获取堆顶部的元素

6.delete():删除堆顶部的元素并保持堆结构

 

但是对HeapSort来说,只有1,3是用到的,具体的HeapSort算法,我用C实现的版本如下:

#include 
#include "heapsort.h"//data:heap data///size: the size of the heap//i: the node neeeded to be adjustedint parent(int i){ return (i-1)/2;}int left(int i){ return (i*2+1);}int right(int i){ return (i*2+2); }void maxHeapIdf(int data[],int size,int i){ int largerId; int temp; int l,r; l=left(i); r=right(i); largerId=i; if(l
=0;i--){ maxHeapIdf(data,size,i); } }void heapSort(int data[],int size){ int i; int temp; buildMaxHeap(data,size); for(i=size-1;i>=0;i--){ temp=data[i]; data[i]=data[0]; data[0]=temp; maxHeapIdf(data,i,0); }}void print(int A[],int heap_size){ int i; for(i = 0; i < heap_size;i++) { printf("%d ", A[i]); } printf("\n");}int main(){ int data[]={ 5,2,3,7,6,4,1 }; heapSort(data,7); print(data,7);}

 

Heap结构除了可以应用到排序上,还是作为优先级队列的一种选择,优先级队里可以用于比如进程调度等场合。

 

转载于:https://www.cnblogs.com/dongyuanshi/p/3559897.html

你可能感兴趣的文章
hadoop大数据平台安全基础知识入门
查看>>
[中国寒龙工具]手机渗透之安全测试软件,内有root 等安全渗透工具,黑客专用。...
查看>>
21世纪初最有影响力的20篇计算机视觉期刊论文
查看>>
地址栏中传递带有特殊字符的参数,进行转义。
查看>>
快速理解C#高级概念(二) 事件与委托的区别
查看>>
针对自己不清楚的地方,弱项击破集合·大问题可变成小问题拆破
查看>>
析构函数 Destructor
查看>>
【leetcode】Insert Interval(hard)★
查看>>
190. Reverse Bits
查看>>
jquery 图片延迟加载
查看>>
JavaScript正则表达式-反向引用
查看>>
允许ubuntu下mysql远程连接
查看>>
【Akka】在并发程序中使用Future
查看>>
设计模式之:代理模式
查看>>
1-4鸡兔同笼
查看>>
VC2010中"Include Directories" 和 "Additional Include Directories"的区别
查看>>
Jsp上传组件Smartupload介绍
查看>>
alias 和 unalias 命令
查看>>
[转]ubuntu 安装源替换-阿里云
查看>>
Spring IoC
查看>>