/*排序算法----堆排序*/
#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;
}
排序算法-----堆排序
最新推荐文章于 2024-08-05 17:56:32 发布