关于堆操作的进一步研究


#include <stdio.h>
#include <iostream>

using namespace std;

int heapsize, length;

//Add a element
void Addheap(int a, int *heap)
{
 heap[heapsize + 1] = a;
 int p = heapsize + 1;
    int q = p>>1;
    heapsize++;

 while(q >= 1)
 {
  if(a > heap[q])
  {
   heap[p] = heap[q]; //down
      p = q;
      q = p>>1;
  }
  else break;
 }
 heap[p] = a;
}

//change a element's value
void change_Value_heap(int p, int value, int *heap)
{
 if(heap[p] != value)
 {
  if(value < heap[p]) //down p<<1
  {
   int q = p<<1;
   while(q <= heapsize)
   {
    cout<<"daitao"<<endl;

    if(q + 1 <= heapsize && heap[q+1] > heap[q]) q++;
    if(value < heap[q])
    {
     heap[p] = heap[q];
        p = q;
        q = p<<1;
    }
    else break;
   }
   heap[p] = value;//a down
  }
  else
  {
   int q = p>>1;
   while(q >= 1)
   {
    if(q + 1 <= heapsize && heap[q+1] > heap[q]) q++;
    if(value > heap[q])
    {
     heap[p] = heap[q];
        p = q;
        q = p>>1;
    }
    else break;
   }
   heap[p] = value;//a up
  }
 }
}


void MAX_heapify(int p, int *heap)
{
 int q = p<<1;
 int largest = p;

 while(q <= heapsize)
 {
  if(q+1 <= heapsize && heap[q] < heap[q+1]) q++;   
  if(heap[q] > heap[p])
   largest = q;
  if(largest != p)
  {
   int t = heap[p];
   heap[p] = heap[largest];
   heap[largest] = t;
   p = largest;
   q = p<<1;
  }
  else break;
 }
}

void build_MAX_heap(int *heap)
{
 int mid = heapsize / 2;
 for(int i = mid; i >= 1; i--)
   MAX_heapify(i, heap);
}

int main()
{
 while(scanf("%d", &length) != EOF)
 {
  int i;
  int heap[1000] = {0};
        heapsize = length;

  for(i = 1; i <= heapsize; i++)
   cin>>heap[i];

        build_MAX_heap(heap);
        for(i = 1; i <= heapsize; i++)
   cout<<heap[i]<<" ";
  cout<<endl;

  int add_element;
  cout<<"please input added element:"<<endl;
  cin>>add_element;

  Addheap(add_element, heap);
        for(i = 1; i <= heapsize; i++)
   cout<<heap[i]<<" ";
  cout<<endl;

  int change_value, position;
  cout<<"please input a position and a value to change:"<<endl;
  cin>>position>>change_value;

  change_Value_heap(position, change_value, heap);

  for(i = 1; i <= heapsize; i++)
   cout<<heap[i]<<" ";
  cout<<endl;
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值