堆排序
来源:互联网 发布:java线程和进程的区别 编辑:程序博客网 时间:2024/05/18 03:13
堆排序:堆可以看成一棵完全二叉树。排序经常使用大顶堆。
//write by daisong 2007 11 24 堆排序 建立堆,调整为大顶堆,输出堆顶的元素,继续调整为大顶堆
#include "iostream.h"
void heapfy(int a[],int low,int high)//调整为大顶堆,除了a[low]外,其余结点满足堆的性质
{
int x,j;
x= a[low]; //暂存调整结点
for( j= 2*low;j<=high;j=j*2)
{ //沿关键字较大的结点向下筛选,low为当前调整结点的下标
if(j<high && a[j] <a[j+1])
j++; //j为当前结点孩子中结点字较大的记录下标
if(x>a[j]) //如果当前结点不小于其孩子结点的关键字
break; //结束调整
a[low] = a[j]; //将孩子结点关键字大的上调
low =j; //继续向下筛选
}
a[low]= x; //把被调整点放入最终的位置上
}
void buildheap(int a[],int n)
{
for(int i=n/2;i>0;i--)
heapfy(a,i,n); //将a[1.....n]调整为堆
}
void heapsort(int a[],int n)
{
int temp;
buildheap(a,n); //建立大顶堆
for (int i =1;i<=n;i++) //进行n-1趟排序
{
{
temp = a[n-i+1]; //交换堆顶和堆中最后一个记录
a[n-i+1] =a[1];
a[1] = temp;
}
heapfy(a,1,n-i); //调整a[1....n-1]为堆
}
}
void main()
{
int a [11] ={0,2,3,5,7,8,1,4,9,10,6};
heapsort(a,10);
for (int i=1;i<11;i++)
{
cout<<a[i]<<endl;
}
}
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- C++基本功和 Design Pattern系列(1) - Inheritance VS Delegation
- 在Visual C++ 6.0下安装opencv
- C++基本功和 Design Pattern系列(2) Type Cast, Interface Inheritance VS Implementation Inheritance
- 关于三成结构
- 火车调度详解
- 堆排序
- VMWare虚拟机也咬人
- 理工评建网截图
- google的妙用一则
- 泡妞意境
- 牛顿迭代法在求解三次方程上的应用
- 第一次注册这样的博客
- ashx文件及其作用.(搜集)
- 解决Virtual PC装Linux出现花屏