堆排序(HeapSort)
来源:互联网 发布:冰川网络股票怎么样 编辑:程序博客网 时间:2024/06/05 04:06
本文主要介绍堆排序算法(HeapSort),堆排序像合并排序而不像插入排序,堆排序的运行时间为O(nlgn);像插入排序而不像合并排序,它是一种原地(in place)排序算法。在任何时候,数组中只有常数个元素存储在输入数组以外,这样,堆排序就把插入排序和合并排序的优点结合起来。
堆排序还引入了另外一种算法设计技术,利用某种数据结构(在此算法中为“堆”)来管理算法执行中的信息。堆数据结构不只在堆排序算法中有用,还可以构成一个有效的优先队列。堆数据结构是一种数组对象,它可以被视为一颗完全二叉树,树种每个结点与数组中存放该结点值的那个元素对应。树的每一层都是填满的,最后一层除外(最后一层从一个结点的左子树开始填)。
一、堆排序算法原理
开始时,堆排序算法先用BuildMaxHeap()函数将n个元素的输入数组array[0...n-1]建造成一个大顶堆。因为数组中最大元素在对应堆树的根A[1],所以可以通过把它与A[n]互换来达到最终正确的位置。现在如果从堆中“去掉”结点n(通过减小堆大小HeapSize),可以很容易的将这一数组转换成一个最大堆。原来根的子女仍是最大堆,而新的堆元素可能违背了最大堆性质。这时调用MaxHeapify(array ,temp)函数就可以保持这一性质,由此在A[1...n-1]中构造出最大堆。堆排序算法不断重复这个过程,堆的大小从n-1一直降到2。
二、堆排序算法的实现
#include <iostream>#include <time.h>#include <stdlib.h>#define N 10using namespace std;//声明建大顶堆函数void BuildMaxHeap(int * array);//声明堆排序函数void HeapSort(int * array);//声明调整为大顶堆函数void MaxHeapify(int * array,int n);//返回堆的数据个数int HeapSize;int main(){//声明一个待排序数组int array[N];//设置随机化种子,避免每次产生相同的随机数 srand(time(0));for(int i=0 ; i<N ; i++) { array[i] = rand()%101;//数组赋值使用随机函数产生1-100之间的随机数 } cout<<"排序前:"<<endl; for(int j=0;j<N;j++) { cout<<array[j]<<" "; } cout<<endl<<"排序后:"<<endl; //调用堆排序函数对该数组进行排序 HeapSort(array); for(int k=0;k<N;k++) { cout<<array[k]<<" "; } cout<<endl; return 0; }void HeapSort(int * array){BuildMaxHeap(array);for(int i=N-1 ; i>=0 ; i--)//数组中下标从0 - N-1{int temp = array[0];array[0] = array[i];array[i] = temp;HeapSize -= 1;MaxHeapify(array,1);//在堆中,堆顶元素下标从1开始}}void BuildMaxHeap(int * array){HeapSize = N;for(int i = N/2 ; i>=1 ; i--)//注意i的取值,堆的高度从1 - N/2{MaxHeapify(array,i);}}void MaxHeapify(int * array,int temp){int largest;//以temp为顶点的子树的堆顶int l = 2*temp ;//求以temp为顶点的子树左儿子int r = 2*temp+1;//求以temp为顶点的子树右儿子if(l <= HeapSize && array[l-1] > array[temp-1])//首先判断左儿子是否存在,即l<=HeapSize{largest = l;}else{largest = temp;}if(r <= HeapSize && array[r-1] > array[largest-1])//首先判断右儿子是否存在,即r<=HeapSize{largest = r;}if(largest != temp){int t = array[temp-1];array[temp-1] = array[largest-1];array[largest-1] = t;MaxHeapify(array,largest);//调整为大顶堆}}
运行结果:
三、堆排序算法分析
堆排序算法集中的插入排序和合并排序的优点,既可以原地排序又有一个较优异的复杂性O(nlgn),而且所采用的堆数据结构还有一个广泛的应用,作为高效的优先级队列(Priority Queue)。详细应用讲解可以参考《算法导论》原书第二版P80。
另外,须知在实际应用中,快速排序的一个好的实现往往由于堆排序。
- 堆排序(HeapSort)
- 堆排序 heapSort
- HeapSort 堆排序
- C++ 堆排序 (HeapSort)
- 堆排序heapsort
- 堆排序(HeapSort)
- HeapSort(堆排序 C++)
- 堆排序(Heapsort)
- 堆排序 (Heapsort)
- 堆排序 Heapsort
- 堆排序(heapsort)
- 堆排序(HeapSort)
- 堆排序(heapsort)
- 堆排序(heapsort)
- heapsort堆排序
- 堆排序heapsort
- 堆排序 HeapSort
- 堆排序(Heapsort)
- Matlab2012b for MAC安装
- DNS 工作原理是什么,域名劫持、域名欺骗、域名污染又是什么
- RedHat Linux 9.0 下vsftpd安装
- 求10^8内的半素数
- switch 之 PHP 和 C 的区别
- 堆排序(HeapSort)
- 巧用vim正则表达式分组替换功能
- zygote通过包装fork完成activity(linux下进程)创建
- #友盟杯#一步步教你为网站开发Android客户端
- 几种常见的排序方法
- 一套完整的makefile样板
- Linux下的javaee开发环境搭建
- 重启tomcat脚本
- 深入理解Java内存模型(一)——基础