33,008
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <stdio.h>
//#include "BinaryHeap.h"
using namespace std;
#pragma once
class BinaryHeap
{
public:
BinaryHeap(int *m_arr, int asize, int anum);
~BinaryHeap(void);
void Add( int data );//往堆添加数值
int GetMin();//获得最小值并从堆里删除这个数值
void ShowArray();
private:
int *arr;
int num;
int size;
};
BinaryHeap::BinaryHeap(int *m_arr,int asize, int anum)
{
size = asize;
num = anum;
arr = new int[size];
for(int i=0; i<size; i++) arr[i] = m_arr[i];
}
BinaryHeap::~BinaryHeap(void)
{
delete arr;
}
void BinaryHeap::Add(int data)
{
num++ ;
arr[num-1] = data;
int i = num/2 -1;
int j = num - 1;
while(arr[i] > arr[j])
{
arr[i] += arr[j];
arr[j] = arr[i] - arr[j];
arr[i] = arr[i] - arr[j];
j = i;
i = (j+1)/2 - 1;
}
}
int BinaryHeap::GetMin ()
{
int min = arr[0];
arr[0] = arr [num -1];
arr [ num -1 ] =0;
num--;
int local = 1;
int child = local*2;
while(child < num)
{
int minarr;
minarr = arr[child-1]<arr[child]?arr[child-1]:arr[child];
if(arr[local-1] > minarr)
{
if(arr[child-1] > arr[child])
{
arr[local-1] += arr[child];
arr[child] = arr[local-1] - arr[child];
arr[local-1] = arr[local-1] - arr[child];
local = child +1;
}
else
{
arr[local-1] += arr[child-1];
arr[child-1] = arr[local-1] - arr[child-1];
arr[local-1] = arr[local-1] - arr[child-1];
local = child ;
}
}
child = local*2;
}
return min;
}
void BinaryHeap::ShowArray()
{
for(int i=0;i<num;i++) cout << arr[i] << " ";
cout << endl;
}
int main()
{
int aarr[16] ={10,30,20,34,38,30,24};
int intadd;
BinaryHeap bh(aarr,(sizeof aarr)/4, 7 );
bh.ShowArray();
bh.Add(15);
bh.ShowArray();
cout << "数组最小的数: "<<bh.GetMin() << endl<<"删除最小的数后:";
bh.ShowArray();
return 0;
}
//当初始num = 1时候,程序会有问题
void BinaryHeap::Add(int data)
{
num++ ; //++后num = 2
arr[num-1] = data;
int i = num/2 -1; // i = 0
int j = num - 1; // j = 1
while(arr[i] > arr[j]) //假设arr[i] > arr[j]进入while
{
arr[i] += arr[j];
arr[j] = arr[i] - arr[j];
arr[i] = arr[i] - arr[j];
j = i; //j = 0
i = (j+1)/2 - 1; //问题来了,这时i = -1,再到while 中的 arr[i],i是-1
}
}