#include <iostream>
#include <cstdlib>
void b_heapify(int* arr, size_t N, size_t i,
bool (*pcmp)(int, int));
void psort(int* arr, size_t N, bool (*pcmp)(int, int));
bool bfind(const int* f, const int* l, int x,
bool (*pcmp)(int, int));
bool compare(int a, int b){ return (a > b); }
int main(void){
const size_t N = 20;
int A[N];
for(size_t i = 0; i < N; ++i){
A[i] = std::rand() % 10;
std::cout << A[i] << ' ';
}
std::cout << std::endl;
//сортируем
psort(A, N, compare);
//вывести отсортированный массив
for(size_t j = 0; j < N; ++j){
// для теста
if(bfind(A, A + N, A[j], compare))
std::cout << A[j] << ' ';
}
std::cout << std::endl;
// найти число X
int X = 7;
/*
std::cout << "Enter X: ";
std::cin >> X;
std::cin.sync();
*/
if(bfind(A, A + N, X, compare))
std::cout << "Yes find." << std::endl;
else
std::cerr << "not found X!" << std::endl;
return 0;
}
/* двоичный поиск ищет значение в упорядоченном
массиве, значение x */
bool bfind(const int* f, const int* l, int x,
bool (*pcmp)(int, int)){
size_t i, j, m;
if((*pcmp)(x, *f) || (*pcmp)(*(l - 1), x))
return false;
i = 0;
j = (size_t)(l - f);
while(i < j){
m = (i + j) >> 1;
if((*pcmp)(x, f[m]))
j = m;
else {
if(x == f[m])
return true;
i = m + 1;
}
}
return false;
}
//---------------------------------------------
//восстановление свойства бинарной кучи
void b_heapify(int* arr, size_t N, size_t i,
bool (*pcmp)(int, int)) {
size_t li, ri, big;
while(1){
li = (i << 1) + 1;
ri = (i << 1) + 2;
if((li < N) && (*pcmp)(arr[i], arr[li]))
big = li;
else
big = i;
if((ri < N) && (*pcmp)(arr[big], arr[ri]))
big = ri;
if(big != i){
std::swap(arr[big], arr[i]);
i = big;
} else
break;
}
}
// пирамидальная сортировка
void psort(int* arr, size_t N, bool (*pcmp)(int, int)){
//собрать кучу
for(size_t i = N >> 1; i > 0; --i)
b_heapify(arr, N, i, pcmp);
b_heapify(arr, N, 0, pcmp);
for(size_t j = 0; j < N; ++j){
std::swap(arr[0], arr[N - 1 - j]);
b_heapify(arr, N - 1 - j, 0, pcmp);
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4Kdm9pZCBiX2hlYXBpZnkoaW50KiBhcnIsIHNpemVfdCBOLCBzaXplX3QgaSwgCgkgICAgICAgICAgIGJvb2wgKCpwY21wKShpbnQsIGludCkpOwp2b2lkIHBzb3J0KGludCogYXJyLCBzaXplX3QgTiwgYm9vbCAoKnBjbXApKGludCwgaW50KSk7CmJvb2wgYmZpbmQoY29uc3QgaW50KiBmLCBjb25zdCBpbnQqIGwsIGludCB4LCAKCSAgICAgICBib29sICgqcGNtcCkoaW50LCBpbnQpKTsKCmJvb2wgY29tcGFyZShpbnQgYSwgaW50IGIpeyByZXR1cm4gKGEgPiBiKTsgfQoKCgppbnQgbWFpbih2b2lkKXsKCWNvbnN0IHNpemVfdCBOID0gMjA7CglpbnQgQVtOXTsKCglmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgTjsgKytpKXsKCQlBW2ldID0gc3RkOjpyYW5kKCkgJSAxMDsKCQlzdGQ6OmNvdXQgPDwgQVtpXSA8PCAnICc7Cgl9CglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoKCS8v0YHQvtGA0YLQuNGA0YPQtdC8Cglwc29ydChBLCBOLCBjb21wYXJlKTsKCgkvL9Cy0YvQstC10YHRgtC4INC+0YLRgdC+0YDRgtC40YDQvtCy0LDQvdC90YvQuSDQvNCw0YHRgdC40LIKCWZvcihzaXplX3QgaiA9IDA7IGogPCBOOyArK2opewoJCS8vINC00LvRjyDRgtC10YHRgtCwCgkJaWYoYmZpbmQoQSwgQSArIE4sIEFbal0sIGNvbXBhcmUpKQoJCQlzdGQ6OmNvdXQgPDwgQVtqXSA8PCAnICc7Cgl9CglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoKCS8vINC90LDQudGC0Lgg0YfQuNGB0LvQviBYCglpbnQgWCA9IDc7Ci8qCQoJc3RkOjpjb3V0IDw8ICJFbnRlciBYOiAiOwoJc3RkOjpjaW4gID4+IFg7CglzdGQ6OmNpbi5zeW5jKCk7CiovCglpZihiZmluZChBLCBBICsgTiwgWCwgY29tcGFyZSkpCgkJc3RkOjpjb3V0IDw8ICJZZXMgZmluZC4iIDw8IHN0ZDo6ZW5kbDsKCWVsc2UKCQlzdGQ6OmNlcnIgPDwgIm5vdCBmb3VuZCBYISIgPDwgc3RkOjplbmRsOwoJcmV0dXJuIDA7Cn0KCgovKiDQtNCy0L7QuNGH0L3Ri9C5INC/0L7QuNGB0Log0LjRidC10YIg0LfQvdCw0YfQtdC90LjQtSDQsiDRg9C/0L7RgNGP0LTQvtGH0LXQvdC90L7QvCAKICAg0LzQsNGB0YHQuNCy0LUsINC30L3QsNGH0LXQvdC40LUgeCAqLwpib29sIGJmaW5kKGNvbnN0IGludCogZiwgY29uc3QgaW50KiBsLCBpbnQgeCwgCgkgICAgICAgYm9vbCAoKnBjbXApKGludCwgaW50KSl7CglzaXplX3QgaSwgaiwgbTsKCWlmKCgqcGNtcCkoeCwgKmYpIHx8ICgqcGNtcCkoKihsIC0gMSksIHgpKQoJCXJldHVybiBmYWxzZTsKCglpID0gMDsKCWogPSAoc2l6ZV90KShsIC0gZik7Cgl3aGlsZShpIDwgail7CgkJbSA9IChpICsgaikgPj4gMTsKCQlpZigoKnBjbXApKHgsIGZbbV0pKQoJCQlqID0gbTsKCQllbHNlIHsKCQkJaWYoeCA9PSBmW21dKQoJCQkJcmV0dXJuIHRydWU7CgkJCWkgPSBtICsgMTsKCQl9Cgl9CglyZXR1cm4gZmFsc2U7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovL9Cy0L7RgdGB0YLQsNC90L7QstC70LXQvdC40LUg0YHQstC+0LnRgdGC0LLQsCDQsdC40L3QsNGA0L3QvtC5INC60YPRh9C4CnZvaWQgYl9oZWFwaWZ5KGludCogYXJyLCBzaXplX3QgTiwgc2l6ZV90IGksIAoJICAgICAgICAgICBib29sICgqcGNtcCkoaW50LCBpbnQpKSB7CglzaXplX3QgbGksIHJpLCBiaWc7CgoJd2hpbGUoMSl7CgkJbGkgPSAoaSA8PCAxKSArIDE7CgkJcmkgPSAoaSA8PCAxKSArIDI7CgkJaWYoKGxpIDwgTikgJiYgKCpwY21wKShhcnJbaV0sIGFycltsaV0pKQoJCQliaWcgPSBsaTsKCQllbHNlCgkJCWJpZyA9IGk7CgoJCWlmKChyaSA8IE4pICYmICgqcGNtcCkoYXJyW2JpZ10sIGFycltyaV0pKQoJCQliaWcgPSByaTsKCgkJaWYoYmlnICE9IGkpewoJCQlzdGQ6OnN3YXAoYXJyW2JpZ10sIGFycltpXSk7CgkJCWkgPSBiaWc7CgkJfSBlbHNlCgkJCWJyZWFrOwoJfQp9CgovLyDQv9C40YDQsNC80LjQtNCw0LvRjNC90LDRjyDRgdC+0YDRgtC40YDQvtCy0LrQsAp2b2lkIHBzb3J0KGludCogYXJyLCBzaXplX3QgTiwgYm9vbCAoKnBjbXApKGludCwgaW50KSl7CgkvL9GB0L7QsdGA0LDRgtGMINC60YPRh9GDCglmb3Ioc2l6ZV90IGkgPSBOID4+IDE7IGkgPiAwOyAtLWkpIAoJCWJfaGVhcGlmeShhcnIsIE4sIGksIHBjbXApOwoJYl9oZWFwaWZ5KGFyciwgTiwgMCwgcGNtcCk7CgoJZm9yKHNpemVfdCBqID0gMDsgaiA8IE47ICsrail7CgkJc3RkOjpzd2FwKGFyclswXSwgYXJyW04gLSAxIC0gal0pOwoJCWJfaGVhcGlmeShhcnIsIE4gLSAxIC0gaiwgMCwgcGNtcCk7Cgl9Cn0=