#include <iostream>
#include <cstring>
#define MAX_LEN 25
void str_swap(char* a, char* b);
void heapify(char arr[][MAX_LEN], int rows, int i, bool (*cmp)(const char*, const char*)) ;
void hsort(char arr[][MAX_LEN], int rows, bool (*cmp)(const char*, const char*));
bool compare(const char* a, const char* b){
return (std::strcmp(a, b) > 0);
}
int main(void){
int rows = 7;
char arr[32][MAX_LEN] = {
{ "vlad" },
{ "kostya" },
{ "anya" },
{ "vasy" },
{ "boris" },
{ "sveta" },
{ "vity" },
};
hsort(arr, rows, compare);
for(int i = 0; i < rows; ++i)
std::cout << arr[i] << std::endl;
return 0;
}
void heapify(char arr[][MAX_LEN], int rows, int i, bool (*cmp)(const char*, const char*)) {
int li, ri, big;
while(1) {
li = i*2 + 1;
ri = li + 1;
if((li < rows) && (*cmp)(arr[li], arr[i]))
big = li;
else
big = i;
if((ri < rows) && (*cmp)(arr[ri], arr[big]))
big = ri;
if(big != i) {
str_swap(arr[big], arr[i]);
i = big;
} else
break;
}
}
//пирамидальная сортировка
void hsort(char arr[][MAX_LEN], int rows, bool (*cmp)(const char*, const char*)){
for(int i = rows / 2; i >= 0; --i)
heapify(arr, rows, i, cmp);
for(int j = rows - 1; j >= 0; --j){
str_swap(arr[0], arr[j]);
heapify(arr, j, 0, cmp);
}
}
void str_swap(char* a, char* b){
char t[MAX_LEN];
std::strcpy(t, a);
std::strcpy(a, b);
std::strcpy(b, t);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KI2RlZmluZSAgTUFYX0xFTiAgMjUKCnZvaWQgc3RyX3N3YXAoY2hhciogYSwgY2hhciogYik7CnZvaWQgaGVhcGlmeShjaGFyIGFycltdW01BWF9MRU5dLCBpbnQgcm93cywgaW50IGksIGJvb2wgKCpjbXApKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikpIDsKdm9pZCBoc29ydChjaGFyIGFycltdW01BWF9MRU5dLCBpbnQgcm93cywgYm9vbCAoKmNtcCkoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKSk7Cgpib29sIGNvbXBhcmUoY29uc3QgY2hhciogYSwgY29uc3QgY2hhciogYil7CglyZXR1cm4gKHN0ZDo6c3RyY21wKGEsIGIpID4gMCk7Cn0KCgppbnQgbWFpbih2b2lkKXsKCWludCAgcm93cyA9IDc7CgljaGFyIGFyclszMl1bTUFYX0xFTl0gPSB7CgkJeyAidmxhZCIgICB9LAoJCXsgImtvc3R5YSIgfSwKCQl7ICJhbnlhIiAgIH0sCgkJeyAidmFzeSIgICB9LAoJCXsgImJvcmlzIiAgfSwKCQl7ICJzdmV0YSIgIH0sCgkJeyAidml0eSIgICB9LAoJfTsKCgloc29ydChhcnIsIHJvd3MsIGNvbXBhcmUpOwoKCWZvcihpbnQgaSA9IDA7IGkgPCByb3dzOyArK2kpCgkJc3RkOjpjb3V0IDw8IGFycltpXSA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQoKCnZvaWQgaGVhcGlmeShjaGFyIGFycltdW01BWF9MRU5dLCBpbnQgcm93cywgaW50IGksIGJvb2wgKCpjbXApKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikpIHsKCWludCAgbGksIHJpLCBiaWc7Cgl3aGlsZSgxKSB7CgkJbGkgPSBpKjIgKyAxOwoJCXJpID0gbGkgICsgMTsKCgkJaWYoKGxpIDwgcm93cykgJiYgKCpjbXApKGFycltsaV0sIGFycltpXSkpCgkJCWJpZyA9IGxpOwoJCWVsc2UKCQkJYmlnID0gaTsKCgkJaWYoKHJpIDwgcm93cykgJiYgKCpjbXApKGFycltyaV0sIGFycltiaWddKSkKCQkJYmlnID0gcmk7CgoJCWlmKGJpZyAhPSBpKSB7CgkJCXN0cl9zd2FwKGFycltiaWddLCBhcnJbaV0pOwoJCQlpID0gYmlnOwoJCX0gZWxzZQoJCQlicmVhazsKCX0KfQoKLy/Qv9C40YDQsNC80LjQtNCw0LvRjNC90LDRjyDRgdC+0YDRgtC40YDQvtCy0LrQsAp2b2lkIGhzb3J0KGNoYXIgYXJyW11bTUFYX0xFTl0sIGludCByb3dzLCBib29sICgqY21wKShjb25zdCBjaGFyKiwgY29uc3QgY2hhciopKXsKCWZvcihpbnQgaSA9IHJvd3MgLyAyOyBpID49IDA7IC0taSkgCgkJaGVhcGlmeShhcnIsIHJvd3MsIGksIGNtcCk7CgkKCWZvcihpbnQgaiA9IHJvd3MgLSAxOyBqID49IDA7IC0tail7CgkJc3RyX3N3YXAoYXJyWzBdLCBhcnJbal0pOwoJCWhlYXBpZnkoYXJyLCBqLCAwLCBjbXApOwoJfQp9CgoKdm9pZCBzdHJfc3dhcChjaGFyKiBhLCBjaGFyKiBiKXsKCWNoYXIgdFtNQVhfTEVOXTsKCXN0ZDo6c3RyY3B5KHQsIGEpOwoJc3RkOjpzdHJjcHkoYSwgYik7CglzdGQ6OnN0cmNweShiLCB0KTsJCn0=