排序算法-----堆排序

/*排序算法----堆排序*/
#include<iostream>
#include<ctime> 
#include<stdlib.h>
#include<assert.h> 
using namespace std;
template<typename Item>
/*泛型编程改进;注意这句话要写在函数的前面*/ 
/*具体怎么分治*/
class Maxheap
/*最大堆的定义是:父节点数据一定比子节点数据大,左右节点到底谁大没有关系*/
{
	private:
		Item *data;/*遍历数据用的指针*/
		int count;
		int capacity;
		void shiftup(int k)/*进堆与父节点比较从而实现向上调整*/
		{
			while(k>=2&&data[k/2]<data[k])
			/*k>=2为了保证最后一次验证的是整个堆的根节点*/
			{
				swap(data[k/2],data[k]);
				k=k/2;
			}
		}
		void shiftdown(int k)/*出堆相比进堆麻烦一点;因为出堆是把堆顶点拿掉,把右下角的数据拿上去;再从顶点向下调整;向下调整就会面对左右孩子两种情况的讨论*/
		{
			while(2*k<=count)/*没有一个节点在有右孩子的情况下而没有左孩子(2k就是左孩子)*/
			{
				int j=2*k;/*data[k]与data[j]交换位置*/
				if(j+1<=count&&data[j+1]>data[j])/*如果发现存在右孩子,并且右孩子大于左孩子*/
				j=j+1; 
				if(data[k]>=data[j])
				break;
				swap(data[k],data[j]);
				k=j; 
				 
			}
		}
	public:
		Maxheap(int capacity)
		/*构造函数*/
		{
			data=new Item[capacity+1];
			//给data,new一个Item型的数组 
			/*因为我们默认从一开始存数据*/
			count=0;
			/*一开始的数据存放个数是为0*/
			this->capacity=capacity;
			/*将用户输入的capacity传给类自己的capacity*/
		}
		~Maxheap()
		/*析构函数*/
		{
			delete []data;
			//释放的时候直接删除就是 
			//delete data[];错误的写法 
		 } 
		int size()
		{
			return count;/*返回真实存放了多少个数据*/
		}
		bool isempty()
		{
			return count==0;
			/*return后面可以直接写判断语句*/
			// if(count==0) return True;
			//  else return  False;
		}
		void insert(Item item)
		{
			assert(count+1<capacity); 
			/*判断一下装了数据后的角标是不是小于最大容量*/
			/*小于则说明还至少可以存进去一个*/
			/*不能取等于是因为堆的角标第一个是没有存东西的,所以就表示容量范围[0~~capacity-1]*/
			data[count+1]=item;
			count++;
			shiftup(count);
		}
		Item extramax()/*顶点的数据出堆*/
		{
			assert(count>0);/*断言判断已知的堆里面是不是有数据存着的*/
			Item ret =data[1] ;
			swap(data[1],data[count]);
			count--;
			shiftdown(1);
			return ret;
			
			
		 } 
};

int main()
{
	Maxheap<int>maxheap=Maxheap<int>(100);
	/*在Maxheap类型中的maxheap堆里面安排100个存放整型数据的位置*/
	//cout<<maxheap.size();
	srand(time(0));
	for(int i=0;i<15;i++)
		{
			maxheap.insert(rand()%100); //随机产生15个数进行比较 
		} 
	while(!maxheap.isempty())
		cout<<maxheap.extramax()<<" ";
    system("pause");
    return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值