排序算法——堆排序
来源:互联网 发布:java字符流写入文件 编辑:程序博客网 时间:2024/05/16 12:13
堆排序实例
首先,建立初始的堆结构如图:
然后,交换堆顶的元素和最后一个元素,此时最后一个位置作为有序区(有序区显示为黄色),然后进行其他无序区的堆调整,重新得到大顶堆后,交换堆顶和倒数第二个元素的位置……
重复此过程:
最后,有序区扩展完成即排序完成:
由排序过程可见,若想得到升序,则建立大顶堆,若想得到降序,则建立小顶堆。
// tt.cpp : 定义控制台应用程序的入口点。////堆排序思想(升序):先建立大顶堆,把最大的顶拉倒最后边,再进行堆调整#include "stdafx.h"void AjustHeap(int a[], int count, int current){int lchild = 2*current + 1;int rchild = 2*current + 2;int max = current;if (lchild<=count-1 && a[lchild] > a[max]){max = lchild;}if (rchild<=count-1 && a[rchild] > a[max]){max = rchild;}if (max != current){int temp = a[current];a[current] = a[max];a[max] = temp;//对变动子节点进行递归,保证大顶堆AjustHeap(a, count, max);}}void sort(int a[], int count){//建立大顶堆for (int i=count/2 - 1; i>=0; i--){AjustHeap(a, count, i);}//不断地调整for (int i=count; i>=1; i--){int temp = a[0];a[0] = a[i-1];a[i-1] = temp;//最后一个元素就不再参与调整了AjustHeap(a,i-1,0);}}int _tmain(int argc, _TCHAR* argv[]){int a[10] = {5,7,4,9,0,8,1,2,6,3};sort(a, 10);return 0;}
性能分析
- 调堆:上面已经分析了,调堆的运行时间为O(h)。
- 建堆:每一层最多的节点个数为n1 = ceil(n/(2^(h+1))),
因此,建堆的运行时间是O(n)。
- 循环调堆(代码67-74),因为需要调堆的是堆顶元素,所以运行时间是O(h) = O(floor(logn))。所以循环调堆的运行时间为O(nlogn)。
总运行时间T(n) = O(nlogn) + O(n) = O(nlogn)。对于堆排序的最好情况与最坏情况的运行时间,因为最坏与最好的输入都只是影响建堆的运行时间O(1)或者O(n),而在总体时间中占重要比例的是循环调堆的过程,即O(nlogn) + O(1) =O(nlogn) + O(n) = O(nlogn)。因此最好或者最坏情况下,堆排序的运行时间都是O(nlogn)。而且堆排序还是原地算法(in-place algorithm)。
0 0
- 排序算法—堆排序
- 排序算法—堆和堆排序
- 排序算法——堆排序算法
- 排序算法——堆排序
- 排序算法——堆排序
- 常用排序算法——堆排序
- 排序算法——堆排序
- 排序算法——堆排序
- 算法——排序之堆排序
- 排序算法——堆排序
- 排序算法——堆排序
- 排序算法——堆排序
- 排序算法系列——堆排序
- 【排序算法】——堆排序
- 经典排序算法——堆排序
- 排序算法——堆排序
- 排序算法——堆排序
- 常用排序算法——堆排序
- SharedPreferences的跨应用读/写
- 学习笔记9:Scala外部类和内部类
- 面向 Perl 开发人员的 XML,第 2 部分: 使用到 Perl 的高级 XML 解析技术
- 克隆后手动设置IP启动网卡报错
- 一些OJ的排序题(冒泡排序的一般形式)
- 排序算法——堆排序
- 黑马程序员_java正则表达式
- ViewPage详解
- 管理系统UI之四:使用全屏沉浸模式(Using Immersive Full-Screen Mode)
- DOS下for循环运用
- HTML+CSS+JavaScript基础知识
- android 编程规范
- grep正则表达
- 链表的应用~