Abstract:
1.using complete binary tree rather than struct.So the son of root i is 2xi + 1 and 2 * i + 2,just an array.降维。
2.下降法,让每一个顶都是其所在家族的最大值,然后当father被选走后,从两个儿子里二选一,一定是最大的。
3.删除和插入一定要改变全局变量和heap_size的值
#include<iostream>
#include<iomanip>
#include<string.h>
#include<algorithm>
using namespace std;
#define MAX 1000
int heap_size, array[MAX];
int left( int x )
{
return x * 2 + 1;
}
int right( int x )
{
return x * 2 + 2;
}
void swap ( int * a, int * b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void adjust( int *heap, int pointer)
{
int rightson = right( pointer), leftson = left( pointer ), largest = pointer;
if( rightson < heap_size && heap[rightson] > heap[largest] )
largest = rightson;
if( leftson < heap_size && heap[leftson] > heap[largest] )
largest = leftson;
if( largest == pointer )
return ;
swap( &heap[pointer] , &heap[largest] );
adjust( heap, largest );
}
void build( int *heap, int length)
{
for( int i = (length-1)/2 ; i >= 0; i-- ) //数组从0开始,father[i] = ( i - 1 ) / 2,而不是i/2.
adjust( heap, i );
}
void heap_sort( int *heap, int length)
{
int temp_size = heap_size;
for( int i = length-1 ; i>0; i-- )
{
swap(& heap[i], & heap[0] );
heap_size --;
adjust(heap, 0); //pointer:根的两个儿子,在各自的家族中仍是最大的,所以,把根去掉后,从另个儿子中选一个大的,一定是最大的。
}
heap_size = temp_size; //heap_size 影响adjust函数,所以要临时改变一下,用完再改回来
}
void insert( int * heap, int value)
{
heap[heap_size] = value;
heap_size ++; // 插入后,堆要增大一个
int temp_size = heap_size - 1;
while( heap[temp_size/2] < heap[temp_size])
{
swap( &heap[temp_size],& heap[temp_size/2]);
temp_size /= 2;
}
}
void deleteitem( int *heap, int value)
{
int i;
for( i = 0; i < heap_size; i++ )
if( heap[i] == value)
break;
heap[i] = heap[heap_size - 1];
heap_size --; //删除后,堆要减小一个
adjust( heap, i);
}
void print( int * heap, int length)
{
for( int i = 0; i < length; i++ )
{
cout << heap[i] << " ";
}
cout << endl;
}
int main()
{
int m;
cin >> m;
for( int i = 0; i < m; i++ )
cin >> array[i];
heap_size = m;
build(array, m );
print( array,m);
// heap_sort(array, m );
// print(array, m );
int number;
cin >> number;
insert( array ,number);
print(array, heap_size);
cin >> number;
deleteitem(array, number);
print(array,heap_size);
heap_sort(array, heap_size);
print(array,heap_size);
}