堆排序
2015-08-22 16:05
267 查看
首先将存放在L[1...n]中的那个元素建成初始堆,由于堆本身的特点,堆顶元素就是最大值。输出堆顶元素后,通常将堆底元素送入堆顶,此时根节点已不满足大顶堆的性质,将堆顶元素向下调整使其继续保持大顶堆的性质,再输出堆顶元素,直到堆中只剩下一个元素为止。
[/code]时间复杂度:o(nlog2n)(以2为底的对数,2不会写成下标的形式)不稳定排序
来自为知笔记(Wiz)
void AdjustDown(ElemType A[], int k, int len)
{
//函数AdjustDown是将元素i向下进行调整
A[0]=A[k];//A[0]暂存
for(i=2*k; i<len; i*=2)//沿key较大的子节点向下进行筛选
{
if(i<len && A[i]<A[i+1])
i++;//获取key叫到的子节点的下标
if(A[0]>=A[i])
{
break;//筛选结束
}else{
A[k]=A[i];//将A[i]调整到双亲节点上
k=i;//修改k值,以便继续向下筛选
}
}
A[k]=A[0];//被筛选的值存放到最终的位置
}
void BuildMaxHeap(ElemType A[], int len)
{
for(int i=len/2; i>0; i--)//从i[n/2]~1,反复调整堆
{
AdjustDown(A, i, len);
}
}
void HeapSort(ElemType A[], int len)
{
BuildMaxHeap(A, len);//初始建堆
for(i=len; i>1; i--)//n-1趟的交换和建堆过程
{
Swap(A[i], A[1]);//输出堆顶的元素(和堆低元素进行交换)
AdjustDown(A, 1, i-1);//整理把剩余的i-1个元素整理成堆
}
}
[/code]时间复杂度:o(nlog2n)(以2为底的对数,2不会写成下标的形式)不稳定排序
来自为知笔记(Wiz)
相关文章推荐
- 数学概念——I - 数论,线性方程
- Injection of resource dependencies failed解决办法总结
- 5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
- 基本概念——类和对象
- 字符串常量与变量
- Qt 界面:窗口图标以及任务栏图标的设置
- POJ 3678 2-sat,基础题
- 邮箱跳转
- UI - 组合控件LTView(UILabel + UITextField)
- Lightoj 1140(数位DP)
- ODOO8 按钮权限更改(3)
- bson json区别
- bson json区别
- bson json区别
- bson json区别
- bson json区别
- bson json区别
- bson json区别
- bson json区别
- bson json区别