排序算法——堆排序

来源:互联网 发布: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))),

image

因此,建堆的运行时间是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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小米5s手机黑屏打不开怎么办 小米5s黑屏只能开关机怎么办 手机拨号键没了怎么办 华为手机桌面拨号图标不见了怎么办 华为手机拨号图标不见了怎么办 小米4s屏幕显示黑屏怎么办 平板拨号键没了怎么办 华为手机拨号图标没了怎么办 华为荣耀手机进水了怎么办 华为畅享7黑屏怎么办 华为畅玩7x黑屏怎么办 华为手机打电话时黑屏怎么办 三星a8手机黑屏打不开怎么办 华为手机恢复出厂后黑屏怎么办 华为荣耀4c白屏怎么办 华为荣耀6手机信号不好怎么办 华为荣耀8手机音量小怎么办 无法激活触控id怎么办 魅蓝2卡顿怎么办 小米max2玩王者荣耀卡怎么办 小米4玩王者荣耀卡怎么办 华为荣耀7i卡顿怎么办 华为荣耀7卡的怎么办 荣耀8手机有孤独怎么办 红米note4玩游戏卡怎么办 红米note4x玩游戏卡怎么办 华为4c死屏怎么办 华为4c充电很慢怎么办? 华为4c突然死机了怎么办 华为畅玩4c内存不足怎么办 荣耀4c一直亮屏怎么办 华为手机返回键失灵怎么办 荣耀6p死机了怎么办 荣耀6主板烧坏了怎么办 虚拟运营商倒闭了号怎么办 买到二次放号怎么办 新运动鞋鞋穿着有点紧怎么办 一件代发被买家退货后怎么办? 洗了翻毛的鞋子怎么办 猫眼竹芋泡根了怎么办 双线花叶子卷了怎么办