Theory:大小顶堆,排序,插入,删除

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);
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值