#include <iostream>
template<typename T, typename Cmp1, typename Cmp2>
void bsort_if(T a[], unsigned n, Cmp1 cmp1, Cmp2 cmp2){
bool next;
unsigned i, j;
do {
next = false;
for(i = j = 0; i < n; i = j){
while((i < n) && !cmp1(a[i]))
++i;
j = i + 1;
while((j < n) && !cmp1(a[j]))
++j;
if((j < n) && cmp2(a[j], a[i])){
std::swap(a[j], a[i]);
next = true;
}
}
} while(next);
}
int main(void){
int a[] = { -1, 3, -7, 6, 5, -1, 7, 4, 1, -4, 8, 9, -5, 2 };
unsigned n = sizeof(a)/sizeof(a[0]);
bsort_if(a, n,
[] (int n) { return (n > 0); },
[] (int a, int b) { return (a < b); }
);
for(unsigned i = 0; i < n; ++i)
std::cout << a[i] << ' ';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ21wMSwgdHlwZW5hbWUgQ21wMj4Kdm9pZCBic29ydF9pZihUIGFbXSwgdW5zaWduZWQgbiwgQ21wMSBjbXAxLCBDbXAyIGNtcDIpewoJYm9vbCBuZXh0OwoJdW5zaWduZWQgaSwgajsKCWRvIHsKCQluZXh0ID0gZmFsc2U7CgkJZm9yKGkgPSBqID0gMDsgaSA8IG47IGkgPSBqKXsKCQkJd2hpbGUoKGkgPCBuKSAmJiAhY21wMShhW2ldKSkKCQkJCSsraTsKCgkJCWogPSBpICsgMTsKCQkJd2hpbGUoKGogPCBuKSAmJiAhY21wMShhW2pdKSkKCQkJCSsrajsKCgkJCWlmKChqIDwgbikgJiYgY21wMihhW2pdLCBhW2ldKSl7CgkJCQlzdGQ6OnN3YXAoYVtqXSwgYVtpXSk7CgkJCQluZXh0ID0gdHJ1ZTsKCQkJfQoJCX0KCX0gd2hpbGUobmV4dCk7Cn0KCmludCBtYWluKHZvaWQpewoJaW50ICAgIGFbXSA9IHsgLTEsIDMsIC03LCA2LCA1LCAtMSwgNywgNCwgMSwgLTQsIDgsIDksIC01LCAyIH07Cgl1bnNpZ25lZCBuID0gc2l6ZW9mKGEpL3NpemVvZihhWzBdKTsKCglic29ydF9pZihhLCBuLCAKCSAgICAgICAgW10gKGludCBuKSB7IHJldHVybiAobiA+IDApOyB9LCAKCSAgICAgICAgW10gKGludCBhLCBpbnQgYikgeyByZXR1cm4gKGEgPCBiKTsgfQoJKTsKCglmb3IodW5zaWduZWQgaSA9IDA7IGkgPCBuOyArK2kpCgkJc3RkOjpjb3V0IDw8IGFbaV0gPDwgJyAnOwoJcmV0dXJuIDA7Cn0=