堆排序
来源:互联网 发布:唐泽寿明知乎 编辑:程序博客网 时间:2024/04/28 13:46
把一个结点放在合适的值上
void Sift(RecType R[],int k,int n)
{//k表示被筛选的结点的关键字,n表示待排序的记录个数
int i, j;
i=k;
j=2*i; //计算R[i]的左孩子位置
R[0]=R[i]; //将R[i]保存在临时单元中
while(j<=n)
{ if((j<n)&&(R[j].key>R[j+1].key))
++j; //选择左右孩子中最小者
if(R[0].key>R[j].key) //当前结点大于左右孩子的最小者
{ R[i]=R[j];
i=j; j=2*i; }
else //当前结点不大于左右孩子
break;
}
R[i]=R[0]; //被筛选结点放到最终合适的位置上
void Sift(RecType R[],int k,int n)
{//k表示被筛选的结点的关键字,n表示待排序的记录个数
int i, j;
i=k;
j=2*i; //计算R[i]的左孩子位置
R[0]=R[i]; //将R[i]保存在临时单元中
while(j<=n)
{ if((j<n)&&(R[j].key>R[j+1].key))
++j; //选择左右孩子中最小者
if(R[0].key>R[j].key) //当前结点大于左右孩子的最小者
{ R[i]=R[j];
i=j; j=2*i; }
else //当前结点不大于左右孩子
break;
}
R[i]=R[0]; //被筛选结点放到最终合适的位置上
}
堆排序的算法描述如下:void Heap_Sort(RecType R[],int n){ int j; for(j=n/2;j>0;--j) //建初始堆 Sift(R,j,n); for(j=n;j>1;--j)
{ //进行n-1趟排序 R[0]=R[1]; //将堆顶元素与堆中最后一个元素交换 R[1]=R[j]; R[j]=R[0]; Sift(R,l,j-1); //将R[1]..R[j-1]调整为堆 } }
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- Citrix NetScaler负载均衡
- 2011年.NET面试题总结(很经典的)
- 2012 Multi-University Training Contest 1 Holedox Eating(线段树)
- HUDOJ-1425-sort
- 在RHEL5下构建基于虚拟用户的Postfix邮件系统
- 堆排序
- for(变量:变量)形式 详解
- JQuery选择器DEMO
- hit2060
- 51CTO专访章文嵩博士:做系统要先了解业务的需求
- 通用工具-Time时间转换类
- sql反模式分析1
- Java多线程编程--(3)线程互斥、同步的理解
- 第三方控件DEV的checkedListBoxControl的用法