数据结构 | 堆排序

2023-12-14 19:40:15
#include<stdlib.h>	
#include<iostream.h>
/*
template<class T>//方法1
void BuildHeap(T* pa,int size)	//建堆
{
	for(int i=size/2-1;i>=0;i--)	//从邻近叶子的第一个非叶子结点至根节点
		PercolateDown(pa,i,size);	//向下调整为堆
}

template<class T>
void PercolateDown(T* pa,int pos,int size)	//将[pos,size)范围内的数据向下调整为堆
{
	int p=pos,c=2*p+1;
	T temp=pa[p];
	while(c<size)
	{
		if(c+1<size&&pa[c+1]>pa[c])	//取孩子结点中的最大值
			++c;
		if(temp>=pa[c])
			break;
		else
		{
			pa[p]=pa[c];//孩子结点大就向上移动
			p=c;c=2*p+1;	//向下循环
		}
	}
	pa[p]=temp;
}

template<class T>
void HeapSort1(T* pa,int n)		//堆排序
{
	T temp;
	BuildHeap(pa,n);	//建大根堆
	for(int i=n-1;i>0;i--)
	{
		temp=pa[0];			//首尾交换
		pa[0]=pa[i];
		pa[i]=temp;
		PercolateDown(pa,0,i);//将[pos,size)范围内的数据向下调整为堆
	}
}
*/
template<class T>//方法2
void PercolateUp(T* pa,int pos)		//从下标为pos的元素开始向上调整为堆
{
	int c=pos,p=(c-1)/2;
	T temp=pa[c];
	while(c>0)
		if(pa[p]>temp)
			break;
		else
		{
			pa[c]=pa[p];	//小就下移
			c=p;p=(c-1)/2;	//向上循环
		}
	pa[c]=temp;
}
template<class T>		//将[0,size)范围内的数据向下调整为堆
void PercolateDown(T* pa,int size)
{
	int p=0,c=2*p+1;
	T temp=pa[p];
	while(c<size)
	{
		if(c+1<size&&pa[c+1]>pa[c])
			++c;
		if(temp>pa[c])
			break;
		else
		{
			pa[p]=pa[c];	//大就上移
			p=c;c=2*p+1;	//向下循环
		}
	}
	pa[p]=temp;
}
template<class T>
void BuildHeap(T* pa,int size)	//从第2个元素开始向上调整为堆
{
	for(int i=1;i<size;i++)
		PercolateUp(pa,i);
}
template<class T>
void HeapSort2(T* pa,int n)
{
	BuildHeap(pa,n);
	T temp;
	for(int i=n-1;i>0;i--)
	{
		temp=pa[0];			//首尾交换
		pa[0]=pa[i];
		pa[i]=temp;
		PercolateDown(pa,i);//将[0,i)范围内的数据向下调整为堆
	}
}

int main()
{
	int a[10]={7,6,5,4,3,2,1,9,8,10};
//	HeapSort1(a,10);//方法1
	HeapSort2(a,10);//方法2
	for(int i=0;i<10;i++)
		cout<<a[i]<<'\t';
	return 0;
}
//Heap.cpp
#include"Heap.h"
Heap::Heap(int max=100)array(100),size(0){}

Heap::Heap(const Vector<T>& vt):array(vt.Size()+10),size(vt.Size())
{
	for(int i=0;i<vt.Size();++i)
		array[i]=vt[i];
	buildHeap();
}

void Heap::buildHeap(void)
{
	for(int i=size/2-1;i>=0;i--)
		PercolateDown(i);
}

?

c4b49596c54e4b0ab5469567eed4a516.jpg

?

文章来源:https://blog.csdn.net/kazuma_hn/article/details/135000585
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。