#include <cstdio>
#include <algorithm>
#define XOR_SWAP(x,y) do { x ^= y; y ^= x; x ^= y; } while (0)
// Quicksort with XOR_SWAP
void qsort1(int *a, int lo, int hi) {
if (lo >= hi) { return; }
int pivot = a[hi];
int i = lo-1;
for (int j = lo; j <= hi; j++) {
if (a[j] <= pivot) {
i = i+1;
XOR_SWAP(a[i], a[j]);
}
}
qsort1(a, lo , i-1);
qsort1(a, i+1, hi );
}
// Quicksort with std::swap
void qsort2(int *a, int lo, int hi) {
if (lo >= hi) { return; }
int pivot = a[hi];
int i = lo-1;
for (int j = lo; j <= hi; j++) {
if (a[j] <= pivot) {
i = i+1;
std::swap(a[i], a[j]);
}
}
qsort2(a, lo , i-1);
qsort2(a, i+1, hi );
}
int main(int argc, char **args) {
int test1[] = { 10, 7, 3, 9, 4, 1, 2, 6, 5, 8 };
int test2[] = { 10, 7, 3, 9, 4, 1, 2, 6, 5, 8 };
qsort1(test1, 0, 9);
qsort2(test2, 0, 9);
std::printf("\nTest 1 (XOR swap):\n\n");
for (int i = 0; i < 10; i++) {
std::printf("%d\n", test1[i]);
}
std::printf("\nTest 2 (std::swap):\n\n");
for (int i = 0; i < 10; i++) {
std::printf("%d\n", test2[i]);
}
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCiNkZWZpbmUgWE9SX1NXQVAoeCx5KSBkbyB7IHggXj0geTsgeSBePSB4OyB4IF49IHk7IH0gd2hpbGUgKDApCgovLyBRdWlja3NvcnQgd2l0aCBYT1JfU1dBUAp2b2lkIHFzb3J0MShpbnQgKmEsIGludCBsbywgaW50IGhpKSB7CiAgICBpZiAobG8gPj0gaGkpIHsgcmV0dXJuOyB9CgogICAgaW50IHBpdm90ID0gYVtoaV07CiAgICBpbnQgaSA9IGxvLTE7CgogICAgZm9yIChpbnQgaiA9IGxvOyBqIDw9IGhpOyBqKyspIHsKICAgICAgICBpZiAoYVtqXSA8PSBwaXZvdCkgewogICAgICAgICAgICBpID0gaSsxOwogICAgICAgICAgICBYT1JfU1dBUChhW2ldLCBhW2pdKTsKICAgICAgICB9CiAgICB9CgogICAgcXNvcnQxKGEsIGxvICwgaS0xKTsKICAgIHFzb3J0MShhLCBpKzEsIGhpICk7Cn0KCi8vIFF1aWNrc29ydCB3aXRoIHN0ZDo6c3dhcAp2b2lkIHFzb3J0MihpbnQgKmEsIGludCBsbywgaW50IGhpKSB7CiAgICBpZiAobG8gPj0gaGkpIHsgcmV0dXJuOyB9CgogICAgaW50IHBpdm90ID0gYVtoaV07CiAgICBpbnQgaSA9IGxvLTE7CgogICAgZm9yIChpbnQgaiA9IGxvOyBqIDw9IGhpOyBqKyspIHsKICAgICAgICBpZiAoYVtqXSA8PSBwaXZvdCkgewogICAgICAgICAgICBpID0gaSsxOwogICAgICAgICAgICBzdGQ6OnN3YXAoYVtpXSwgYVtqXSk7CiAgICAgICAgfQogICAgfQoKICAgIHFzb3J0MihhLCBsbyAsIGktMSk7CiAgICBxc29ydDIoYSwgaSsxLCBoaSApOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3MpIHsKICAgIGludCB0ZXN0MVtdID0geyAxMCwgNywgMywgOSwgNCwgMSwgMiwgNiwgNSwgOCB9OwogICAgaW50IHRlc3QyW10gPSB7IDEwLCA3LCAzLCA5LCA0LCAxLCAyLCA2LCA1LCA4IH07CgogICAgcXNvcnQxKHRlc3QxLCAwLCA5KTsKICAgIHFzb3J0Mih0ZXN0MiwgMCwgOSk7CgogICAgc3RkOjpwcmludGYoIlxuVGVzdCAxIChYT1Igc3dhcCk6XG5cbiIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAgICAgICAgc3RkOjpwcmludGYoIiVkXG4iLCB0ZXN0MVtpXSk7CiAgICB9CgogICAgc3RkOjpwcmludGYoIlxuVGVzdCAyIChzdGQ6OnN3YXApOlxuXG4iKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewogICAgICAgIHN0ZDo6cHJpbnRmKCIlZFxuIiwgdGVzdDJbaV0pOwogICAgfQp9