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

来源:互联网 发布:linux 不支持ext4 编辑:程序博客网 时间:2024/04/30 11:33

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 1000int 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
原创粉丝点击