#include <iostream>
using namespace std;
void swap(int& a, int& b) {
int tmp = a;
a = b;
b = tmp;
}
void partition(int* arr, int n, int k) {
int pivot = 0, i = -1;
for (int j = 0; j < n; ++j) {
// If current element is smaller than the pivot
if (arr[j] <= pivot) {
i++; // increment index of smaller element
swap(arr[i], arr[j]);
}
}
if (k != -1)
swap(arr[i + 1], arr[k]);
}
int moveZero(int* arr, int n) {
int zero_pos = n - 1;
int cnt = 0;
while (arr[zero_pos] == 0)
zero_pos--;
for (int i = 0; i <= zero_pos; ++i)
if (arr[i] == 0) {
++cnt;
swap(arr[i], arr[zero_pos]);
--zero_pos;
}
return (cnt > 0) ? zero_pos + 1: -1;
}
void output(int* arr, int n) {
for (int i = 0; i < n; ++i)
cout << arr[i] << " ";
}
int main() {
int a[] = {4, 0, -1, 3, 5, 2, 1, 0, -3, 2, 0}; // trường hợp có nhiều số 0
// int a[] = {4, 0, -1, 3, 5, 2, 1, -3, 2}; // trường hợp không có duy nhất một số 0
// int a[] = {4, -1, 3, 5, 2, 1, -3, 2}; // trường hợp không có số 0
int n = sizeof(a) / sizeof(a[0]);
int k = moveZero(a, n);
partition(a, n, k);
output(a, n);
cout << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCBzd2FwKGludCYgYSwgaW50JiBiKSB7IAogICAgaW50IHRtcCA9IGE7IAogICAgYSA9IGI7IAogICAgYiA9IHRtcDsgCn0KCnZvaWQgcGFydGl0aW9uKGludCogYXJyLCBpbnQgbiwgaW50IGspIHsKICAgIGludCBwaXZvdCA9IDAsIGkgPSAtMTsKCiAgICBmb3IgKGludCBqID0gMDsgaiA8IG47ICsraikgewogICAgICAgIC8vIElmIGN1cnJlbnQgZWxlbWVudCBpcyBzbWFsbGVyIHRoYW4gdGhlIHBpdm90CiAgICAgICAgaWYgKGFycltqXSA8PSBwaXZvdCkgewogICAgICAgICAgICBpKys7IC8vIGluY3JlbWVudCBpbmRleCBvZiBzbWFsbGVyIGVsZW1lbnQKICAgICAgICAgICAgc3dhcChhcnJbaV0sIGFycltqXSk7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChrICE9IC0xKQogICAgICAgIHN3YXAoYXJyW2kgKyAxXSwgYXJyW2tdKTsKfQoKaW50IG1vdmVaZXJvKGludCogYXJyLCBpbnQgbikgewogICAgaW50IHplcm9fcG9zID0gbiAtIDE7CiAgICBpbnQgY250ID0gMDsKCiAgICB3aGlsZSAoYXJyW3plcm9fcG9zXSA9PSAwKQogICAgICAgIHplcm9fcG9zLS07CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gemVyb19wb3M7ICsraSkKICAgICAgICBpZiAoYXJyW2ldID09IDApIHsKICAgICAgICAgICAgKytjbnQ7CiAgICAgICAgICAgIHN3YXAoYXJyW2ldLCBhcnJbemVyb19wb3NdKTsKICAgICAgICAgICAgLS16ZXJvX3BvczsKICAgICAgICB9CgogICAgcmV0dXJuIChjbnQgPiAwKSA/IHplcm9fcG9zICsgMTogLTE7Cn0KCnZvaWQgb3V0cHV0KGludCogYXJyLCBpbnQgbikgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpCiAgICAgICAgY291dCA8PCBhcnJbaV0gPDwgIiAgICI7Cn0KCmludCBtYWluKCkgewogICAgaW50IGFbXSA9IHs0LCAwLCAtMSwgMywgNSwgMiwgMSwgMCwgLTMsIDIsIDB9OyAvLyB0csaw4budbmcgaOG7o3AgY8OzIG5oaeG7gXUgc+G7kSAwCiAgICAvLyBpbnQgYVtdID0gezQsIDAsIC0xLCAzLCA1LCAyLCAxLCAtMywgMn07IC8vIHRyxrDhu51uZyBo4bujcCBraMO0bmcgY8OzIGR1eSBuaOG6pXQgbeG7mXQgc+G7kSAwCiAgICAvLyBpbnQgYVtdID0gezQsIC0xLCAzLCA1LCAyLCAxLCAtMywgMn07IC8vIHRyxrDhu51uZyBo4bujcCBraMO0bmcgY8OzIHPhu5EgMAogICAgaW50IG4gPSBzaXplb2YoYSkgLyBzaXplb2YoYVswXSk7CgogICAgaW50IGsgPSBtb3ZlWmVybyhhLCBuKTsKICAgIHBhcnRpdGlvbihhLCBuLCBrKTsKICAgIG91dHB1dChhLCBuKTsKICAgIGNvdXQgPDwgIlxuIjsKCiAgICByZXR1cm4gMDsKfQ==