堆排序的体会

来源:互联网 发布:同城o2o源码 编辑:程序博客网 时间:2024/04/26 16:14
首先堆排序要承认几个事实:
1. 数组已经给你,相当于一颗完全二叉树已经给出。只是这棵二叉树是以数组形式存储。
2. 结点之间的关系:结点i的孩子的下标是2*i+1和2*i+2(如果有右孩子的话)。
3. 完全二叉树的性质:一个非叶子结点只有一个左孩子或者有两个孩子。
4. 如果以最小堆建堆,最后的数组排序输出结果是倒序(从大到小)
5. 建堆的概念:不是一个一个结点插入堆中。而是一个堆已经给出,我们需要把它调整成最小堆或最大堆。
6. 完全二叉树的最后一个结点的父亲的下标为n/2-1.(数组以0开始,n为数组的长度。)


堆排序的思想:
1. 下标为i=n/2-1的元素开始向下调整,保证以此结点为跟结点的子树满足最小堆的性质。
2. 调整:如果父节点大于两孩子结点的某一个p,则父节点与p交换。然后沿着p往下走。

3. i--;重复步骤1,直到下标为0.




堆排序的性能分析:
建堆需要O(n)。之后进行n-1次向下调整操作,每次调整的时间为O(h)。由于是完全二叉树,所以时间复杂度始终为O(n*logn)。与
数组的初试状态无关。

堆排序是不稳定排序。


void Swap(int &a, int &b){int temp=a;a=b;b=temp;}void AdjustDown(int A[], int s,int n){//注意这里的n是数组的长度,不是数组最后一个元素的下标。int min;for(int i=s;(2*i+1)<n;){if(2*i+2<n && A[2*i+1]>A[2*i+2])//沿较小的子节点向下调整min=2*i+2;else min=2*i+1;if(A[i]<=A[min]) break;//调整结束Swap(A[i],A[min]);     i=min;//沿较小的子节点向下走}}void BuildHeap(int A[], int n){for(int i=n/2-1;i>=0;i--)AdjustDown(A,i,n);}void HeapSort(int A[], int n){BuildHeap(A,n);for(int i=n-1;i>0;i--){Swap(A[0],A[i]);AdjustDown(A,0,i);}}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一年级学生记不住生字怎么办 一年级小孩记不住生字怎么办 配镜度数高了怎么办 宝宝两岁半不肯坐马桶拉臭臭怎么办 儿子字写得不好 怎么办 小孩不听话不爱读书和写字怎么办 两岁宝宝不愿意穿衣服怎么办 做题粗心不认真怎么办 5岁宝宝不会写字怎么办 四岁宝宝不会写字怎么办 4岁宝宝不写字怎么办 四岁宝宝不写字怎么办 孩子学习粗心计算能力差怎么办 一年级的小朋友不爱看书怎么办 马上要生了害怕怎么办 孩子做题不爱读题怎么办 孩子作业写的慢怎么办 孩子学习不好怎么办我们有绝招 英语不会做题怎么办呢? 小学二年级孩子厌学怎么办 狗狗拉肚子不吃东西怎么办 小孩做作业时容易发呆怎么办 一上高速就犯困怎么办 孩子初中数学学不好怎么办 高三注意力不集中怎么办 考砸了家长打我怎么办? 高三学生困疲劳怎么办 高三晚上很困怎么办 孩子上高三压力大不想上学怎么办 高三的孩子压力大怎么办 高三复读压力大怎么办 孩子一年级做数学粗心怎么办 一年级的孩子数学总粗心怎么办 天生手脚笨的人怎么办 高三的孩子厌学怎么办 二年级小孩学习笨怎么办 孩子高二不想上怎么办 高三孩子玩手机怎么办 孩子考试粗心丢题怎么办 工作中总出错是怎么办 工作上做错事了怎么办