#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
void print(const int *a, unsigned n)
{
for (unsigned i = 0; i < n; i++) {
}
}
void swap(int *p, int *q)
{
int t = *p; *p = *q; *q = t;
}
int *partition(int *a, const int *end)
{
int *pivot = a;
for (int *p = pivot + 1; p < end; p++) {
if (*p < *pivot) {
swap(p, pivot + 1);
swap(pivot, pivot + 1);
pivot++;
}
}
return pivot;
}
void quicksort_rec(int *a, const int *end)
{
if (a + 1 < end) {
int *pivot = partition(a, end);
quicksort_rec(a, pivot);
quicksort_rec(pivot + 1, end);
}
}
typedef struct Stack Stack;
enum {
MAX = 32
};
struct Stack {
unsigned n;
int *item[MAX];
};
void push(Stack *st, int *p)
{
if (st->n == MAX) {
fprintf(stderr
, "Stack overflow!\n"); }
st->item[st->n++] = p;
}
int *pop(Stack *st)
{
if (st->n == 0) {
fprintf(stderr
, "Stack underflow!\n"); }
return st->item[--st->n];
}
bool isempty(const Stack *st)
{
return (st->n > 0);
}
void quicksort_iter(int *a, int *end)
{
Stack stack = {0};
push(&stack, a);
push(&stack, end);
while (isempty(&stack)) {
end = pop(&stack);
a = pop(&stack);
if (a + 1 < end) {
int *pivot = partition(a, end);
push(&stack, a);
push(&stack, pivot);
push(&stack, pivot + 1);
push(&stack, end);
}
}
}
int main(void)
{
int a[] = {1, 5, 3, 7, 8, 4, 9, 2, 3, 1, 4, 6, 8, 4};
int b[sizeof(a) / sizeof(*a)];
unsigned n = sizeof(a) / sizeof(*a);
print(a, n);
quicksort_rec(a, a + n);
print(a, n);
print(b, n);
quicksort_iter(b, b + n);
print(b, n);
return 0;
}
CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KCnZvaWQgcHJpbnQoY29uc3QgaW50ICphLCB1bnNpZ25lZCBuKQp7CiAgICBwcmludGYoIlsiKTsKCiAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgaWYgKGkpIHByaW50ZigiLCAiKTsKICAgICAgICBwcmludGYoIiVkIiwgYVtpXSk7CiAgICB9CiAgICAKICAgIHByaW50ZigiXVxuIik7Cn0KCnZvaWQgc3dhcChpbnQgKnAsIGludCAqcSkKewogICAgaW50IHQgPSAqcDsgKnAgPSAqcTsgKnEgPSB0Owp9CgppbnQgKnBhcnRpdGlvbihpbnQgKmEsIGNvbnN0IGludCAqZW5kKQp7CiAgICBpbnQgKnBpdm90ID0gYTsKCiAgICBmb3IgKGludCAqcCA9IHBpdm90ICsgMTsgcCA8IGVuZDsgcCsrKSB7CiAgICAgICAgaWYgKCpwIDwgKnBpdm90KSB7CiAgICAgICAgICAgIHN3YXAocCwgcGl2b3QgKyAxKTsKICAgICAgICAgICAgc3dhcChwaXZvdCwgcGl2b3QgKyAxKTsKICAgICAgICAgICAgcGl2b3QrKzsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybiBwaXZvdDsKfQoKdm9pZCBxdWlja3NvcnRfcmVjKGludCAqYSwgY29uc3QgaW50ICplbmQpCnsKICAgIGlmIChhICsgMSA8IGVuZCkgewogICAgICAgIGludCAqcGl2b3QgPSBwYXJ0aXRpb24oYSwgZW5kKTsKCiAgICAgICAgcXVpY2tzb3J0X3JlYyhhLCBwaXZvdCk7CiAgICAgICAgcXVpY2tzb3J0X3JlYyhwaXZvdCArIDEsIGVuZCk7CiAgICB9Cn0KCnR5cGVkZWYgc3RydWN0IFN0YWNrIFN0YWNrOwoKZW51bSB7CiAgICBNQVggPSAzMgp9OwoKc3RydWN0IFN0YWNrIHsKICAgIHVuc2lnbmVkIG47ICAgIAogICAgaW50ICppdGVtW01BWF07Cn07Cgp2b2lkIHB1c2goU3RhY2sgKnN0LCBpbnQgKnApCnsKICAgIGlmIChzdC0+biA9PSBNQVgpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlN0YWNrIG92ZXJmbG93IVxuIik7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIAogICAgc3QtPml0ZW1bc3QtPm4rK10gPSBwOwp9CgppbnQgKnBvcChTdGFjayAqc3QpCnsKICAgIGlmIChzdC0+biA9PSAwKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJTdGFjayB1bmRlcmZsb3chXG4iKTsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgCiAgICByZXR1cm4gc3QtPml0ZW1bLS1zdC0+bl07Cn0KCmJvb2wgaXNlbXB0eShjb25zdCBTdGFjayAqc3QpCnsKICAgIHJldHVybiAoc3QtPm4gPiAwKTsKfQoKdm9pZCBxdWlja3NvcnRfaXRlcihpbnQgKmEsIGludCAqZW5kKQp7CiAgICBTdGFjayBzdGFjayA9IHswfTsKICAgIAogICAgcHVzaCgmc3RhY2ssIGEpOwogICAgcHVzaCgmc3RhY2ssIGVuZCk7CgogICAgd2hpbGUgKGlzZW1wdHkoJnN0YWNrKSkgewogICAgICAgIGVuZCA9IHBvcCgmc3RhY2spOwogICAgICAgIGEgPSBwb3AoJnN0YWNrKTsKICAgICAgICAKICAgICAgICBpZiAoYSArIDEgPCBlbmQpIHsKICAgICAgICAgICAgaW50ICpwaXZvdCA9IHBhcnRpdGlvbihhLCBlbmQpOwogICAgICAgICAgICAKICAgICAgICAgICAgcHVzaCgmc3RhY2ssIGEpOwogICAgICAgICAgICBwdXNoKCZzdGFjaywgcGl2b3QpOwogICAgICAgIAogICAgICAgICAgICBwdXNoKCZzdGFjaywgcGl2b3QgKyAxKTsKICAgICAgICAgICAgcHVzaCgmc3RhY2ssIGVuZCk7CiAgICAgICAgfQogICAgfQp9CgppbnQgbWFpbih2b2lkKQp7CiAgICBpbnQgYVtdID0gezEsIDUsIDMsIDcsIDgsIDQsIDksIDIsIDMsIDEsIDQsIDYsIDgsIDR9OwogICAgaW50IGJbc2l6ZW9mKGEpIC8gc2l6ZW9mKCphKV07CiAgICB1bnNpZ25lZCBuID0gc2l6ZW9mKGEpIC8gc2l6ZW9mKCphKTsKICAgIAogICAgbWVtY3B5KGIsIGEsIHNpemVvZihhKSk7CiAgICAKICAgIHB1dHMoInJlY3Vyc2l2ZSIpOwogICAgCiAgICBwcmludChhLCBuKTsKICAgIHF1aWNrc29ydF9yZWMoYSwgYSArIG4pOwogICAgcHJpbnQoYSwgbik7CiAgICAKICAgIHB1dHMoIiIpOwogICAgcHV0cygiaXRlcmF0aXZlIik7CiAgICAKICAgIHByaW50KGIsIG4pOwogICAgcXVpY2tzb3J0X2l0ZXIoYiwgYiArIG4pOwogICAgcHJpbnQoYiwgbik7CiAgICAKICAgIHJldHVybiAwOwp9Cg==
recursive
[1, 5, 3, 7, 8, 4, 9, 2, 3, 1, 4, 6, 8, 4]
[1, 1, 2, 3, 3, 4, 4, 4, 5, 6, 7, 8, 8, 9]
iterative
[1, 5, 3, 7, 8, 4, 9, 2, 3, 1, 4, 6, 8, 4]
[1, 1, 2, 3, 3, 4, 4, 4, 5, 6, 7, 8, 8, 9]