#include <iostream>
using namespace std;
#include <algorithm>
#include <iostream>
#define SIZE 20
const int d = 19 ;
//Всплытие
void siftup( int * a, int i) {
int p = ( i - 1 ) / d;
while ( ( i ! = 0 ) && ( a[ p] > a[ i] ) ) {
std:: swap ( a[ i] , a[ p] ) ;
i = p;
p = ( i - 1 ) / d;
}
}
//n - длина массива
int min_child( int * a, int i, int n) {
if ( i* d + 1 >= n) return 0 ;
else {
int s = i* d + 1 ;
int min_key = a[ s] ;
int last = ( i + 1 ) * d;
if ( last >= n) last = n - 1 ;
for ( int j = s+ 1 ; j <= last; j++ ) {
if ( min_key > a[ j] ) {
min_key = a[ j] ;
s = j;
}
}
return s;
}
}
int min_child2( int * a, int i, int n) {
int minchild = 0 ;
std:: cout << "start minchild2" << std:: endl ;
if ( i* d + 1 > n) return 0 ;
else {
int first_child = i* d + 1 ;
int last_child = std:: min ( ( 1 + i) * d - 1 , n) ;
int min_key = a[ first_child] ;
std:: cout << "else minchild2" << std:: endl ;
for ( int i = first_child; i <= last_child; i++ )
if ( a[ i] > min_key) {
min_key = a[ i] ;
minchild = i;
std:: cout << "for loop minchild2" << std:: endl ;
}
std:: cout << "return minchild2" << std:: endl ;
return minchild;
}
}
//Погружение
void siftdown( int * a, int i, int n) {
int s = min_child( a, i, n) ;
std:: cout << "min_child called" << std:: endl ;
while ( ( s ! = 0 ) && ( a[ i] > a[ s] ) ) {
std:: cout << "while loop" << std:: endl ;
std:: swap ( a[ i] , a[ s] ) ;
i = s;
s = min_child( a, s, n) ;
}
}
//Преобразование массива в кучу
void build_dheap( int * a, int n) {
for ( int i = ( n - 1 ) /*/d*/ ; i >= 0 ; i-- )
siftdown( a, i, n) ;
std:: cout << "after siftdown" << std:: endl ;
}
int main( ) {
int a[ SIZE] ;
for ( int i = 0 ; i < SIZE; i++ ) {
a[ i] = i % 10 ;
std:: cout << a[ i] << " " ;
}
std:: cout << std:: endl ;
build_dheap( a, SIZE) ;
std:: cout << std:: endl ;
for ( int i = 0 ; i < SIZE; i++ )
std:: cout << a[ i] << " " ;
return 0 ;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICAgCiAgICAjaW5jbHVkZSA8YWxnb3JpdGhtPgogICAgI2luY2x1ZGUgPGlvc3RyZWFtPgogICAgIAogICAgI2RlZmluZSBTSVpFIDIwCiAgICAgCiAgICBjb25zdCBpbnQgZCA9IDE5OwogICAgIAogICAgLy/QktGB0L/Qu9GL0YLQuNC1CiAgICB2b2lkIHNpZnR1cChpbnQgKmEsIGludCBpKXsKICAgIAlpbnQgcCA9IChpIC0gMSkgLyBkOwogICAgCXdoaWxlKChpICE9IDApICYmIChhW3BdID4gYVtpXSkpewogICAgCQlzdGQ6OnN3YXAoYVtpXSwgYVtwXSk7CiAgICAJCWkgPSBwOwogICAgCQlwID0gKGkgLSAxKSAvIGQ7CiAgICAJfQogICAgfQogICAgIAogICAgLy9uIC0g0LTQu9C40L3QsCDQvNCw0YHRgdC40LLQsAogICAgaW50IG1pbl9jaGlsZChpbnQgKmEsIGludCBpLCBpbnQgbil7CiAgICAJaWYoaSpkICsgMSA+PSBuKSByZXR1cm4gMDsKICAgIAllbHNlewogICAgCQlpbnQgcyA9IGkqZCArIDE7CiAgICAJCWludCBtaW5fa2V5ID0gYVtzXTsKICAgIAkJaW50IGxhc3QgPSAoaSArIDEpKmQ7CiAgICAJCWlmKGxhc3QgPj0gbikgbGFzdCA9IG4gLSAxOwogICAgCQlmb3IoaW50IGogPSBzKzE7IGogPD0gbGFzdDsgaisrKXsKICAgIAkJCWlmKG1pbl9rZXkgPiBhW2pdKXsKICAgIAkJCQltaW5fa2V5ID0gYVtqXTsKICAgIAkJCQlzID0gajsKICAgIAkJCX0KICAgIAkJfQogICAgCQlyZXR1cm4gczsKICAgIAl9CiAgICB9CiAgICAgCiAgICBpbnQgbWluX2NoaWxkMihpbnQgKmEsIGludCBpLCBpbnQgbil7CiAgICAJaW50IG1pbmNoaWxkID0gMDsKICAgIAkKICAgIAlzdGQ6OmNvdXQgPDwgInN0YXJ0IG1pbmNoaWxkMiIgPDwgc3RkOjplbmRsOwogICAgIAogICAgCWlmKGkqZCArIDEgPiBuKSByZXR1cm4gMDsKICAgIAllbHNlewogICAgCQlpbnQgZmlyc3RfY2hpbGQgPSBpKmQgKyAxOwogICAgCQlpbnQgbGFzdF9jaGlsZCA9IHN0ZDo6bWluKCgxICsgaSkqZCAtIDEsIG4pOwogICAgCQlpbnQgbWluX2tleSA9IGFbZmlyc3RfY2hpbGRdOwogICAgCQkKICAgIAkJc3RkOjpjb3V0IDw8ICJlbHNlIG1pbmNoaWxkMiIgPDwgc3RkOjplbmRsOwogICAgCQlmb3IoaW50IGkgPSBmaXJzdF9jaGlsZDsgaSA8PSBsYXN0X2NoaWxkOyBpKyspCiAgICAJCQlpZihhW2ldID4gbWluX2tleSl7CiAgICAJCQkJbWluX2tleSA9IGFbaV07CiAgICAJCQkJbWluY2hpbGQgPSBpOwogICAgCQkJCXN0ZDo6Y291dCA8PCAiZm9yIGxvb3AgbWluY2hpbGQyIiA8PCBzdGQ6OmVuZGw7CiAgICAJCQl9CiAgICAJCXN0ZDo6Y291dCA8PCAicmV0dXJuIG1pbmNoaWxkMiIgPDwgc3RkOjplbmRsOwogICAgCQlyZXR1cm4gbWluY2hpbGQ7CiAgICAJfQogICAgfQogICAgIAogICAgLy/Qn9C+0LPRgNGD0LbQtdC90LjQtQogICAgdm9pZCBzaWZ0ZG93bihpbnQgKmEsIGludCBpLCBpbnQgbil7CiAgICAJaW50IHMgPSBtaW5fY2hpbGQoYSwgaSwgbik7CiAgICAJc3RkOjpjb3V0IDw8ICJtaW5fY2hpbGQgY2FsbGVkIiA8PCBzdGQ6OmVuZGw7CiAgICAJd2hpbGUoKHMgIT0gMCkgJiYgKGFbaV0gPiBhW3NdKSl7CiAgICAJCXN0ZDo6Y291dCA8PCAid2hpbGUgbG9vcCIgPDwgc3RkOjplbmRsOwogICAgCQlzdGQ6OnN3YXAoYVtpXSwgYVtzXSk7CiAgICAJCWkgPSBzOwogICAgCQlzID0gbWluX2NoaWxkKGEsIHMsIG4pOwogICAgCX0KICAgIH0KICAgICAKICAgIC8v0J/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjQtSDQvNCw0YHRgdC40LLQsCDQsiDQutGD0YfRgwogICAgdm9pZCBidWlsZF9kaGVhcChpbnQgKmEsIGludCBuKXsKICAgIAlmb3IoaW50IGkgPSAobiAtIDEpLyovZCovOyBpID49IDA7IGktLSkKICAgIAkJc2lmdGRvd24oYSwgaSwgbik7CiAgICAJc3RkOjpjb3V0IDw8ICJhZnRlciBzaWZ0ZG93biIgPDwgc3RkOjplbmRsOwogICAgfQogICAgIAogICAgaW50IG1haW4oKSB7CiAgICAJaW50IGFbU0laRV07CiAgICAgCiAgICAJZm9yKGludCBpID0gMDsgaSA8IFNJWkU7IGkrKyl7CiAgICAJCWFbaV0gPSBpICUgMTA7CiAgICAJCXN0ZDo6Y291dCA8PCBhW2ldIDw8ICIgIjsKICAgIAl9CiAgICAJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgICAKICAgIAlidWlsZF9kaGVhcChhLCBTSVpFKTsKICAgIAkKICAgIAlzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICAgCWZvcihpbnQgaSA9IDA7IGkgPCBTSVpFOyBpKyspCiAgICAJCXN0ZDo6Y291dCA8PCBhW2ldIDw8ICIgIjsKICAgIAkKICAgIAlyZXR1cm4gMDsKICAgIH0=