#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
using namespace std;
#ifdef DEBUG
#else
#define DEBUG
#define PARENT2(i) unsigned((i)>>1)
#define LEFT(i) unsigned((i)<<1)
#define RIGHT(i) unsigned((-~((i)<<1)))
#endif
int length = 8;
int heapsize = 8;
void MaxHeapify(int A[],int i)
{
int l=LEFT(i);
int r=RIGHT(i);
//cout<<endl<<i<<"#"<<l<<"#"<<r<<"#"<<endl;
int largest=0;
if(l<=heapsize&&A[l]>A[i])
largest=l;
else
largest=i;
if(r<=heapsize&&A[r]>A[largest])
largest=r;
if(largest!=i)
{
int tmp = A[i];
A[i]=A[largest];
A[largest]=tmp;
MaxHeapify(A,largest);
}
}
void BuildMaxHeap(int A[])
{
int i=floor(length/2.0);
for(;i>=1;i--)
MaxHeapify(A,i);
}
void HeapSort(int A[])
{
BuildMaxHeap(A);
for(int i = length;i>=2;i--)
{
int tmp = A[1];
A[1]=A[i];
A[i]=tmp;
heapsize--;
MaxHeapify(A,1);
}
}
//用最大堆实现的最大优先级队列
int Heap_Maxmum(int A[])
{
//返回最大关键字元素
return A[1];
}
int Heap_Extract_Max(int A[])
{
//去掉并返回队列中(原来)最大关键字元素
if(heapsize < 1)
cout<<"heap underflow!"<<endl;
int max = A[1];
A[1] = A[heapsize];
heapsize--;
MaxHeapify(A,1);
return max;
}
void Heap_Increase_Key(int A[],int i,int key)
{
//将元素i的关键字的值增加到key,key不能小于i的原关键字的值(关键字就是对应元素值)
if(key<A[i])
cout<<"new key is smaller than current key!"<<endl;
A[i]=key;
while(i>1&&A[PARENT2(i)]<A[i])
{
int tmp = A[i];
A[i]=A[PARENT2(i)];
A[PARENT2(i)]=tmp;
i=PARENT2(i);
}
}
void Max_Heap_Insert(int A[],int key)
{
//插入新元素
heapsize++;
A[heapsize]=;
Heap_Increase_Key(A,heapsize,key);
}
int main()
{
int T, i = 1, n, a[100];
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
cin >> T;
n = T;
length = n;
heapsize = n;
while(T--)
{
cin>>a[i];
i++;
}
HeapSort(a);
for(i=1;i<=length;i++)
cout<< a[i]<<" ";
fclose(stdin);
//fclose(stdout);
return 0;
}堆排序
最新推荐文章于 2024-06-09 16:03:45 发布
31万+

被折叠的 条评论
为什么被折叠?



