#include <bits/stdc++.h>
using namespace std;
#define el "\n"
#define ll long long
#define ull unsigned long long
#define se second
#define fi first
#define be begin()
#define en end()
#define Faster cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
void selectionSort(vector<int>& arr)
{
for(int i = 0; i < arr.size(); i++)
{
int id = i;
for(int j = i; j < arr.size(); j++)
{
if(arr[j] < arr[id]) id = j;
}
swap(arr[i], arr[id]);
}
}
void insertionSort(vector<int>& arr)
{
for(int i = 1; i < arr.size(); i++)
{
int id = i - 1, tmp = arr[i];
while(id >= 0 && tmp < arr[id])
{
arr[id + 1] = arr[id];
id--;
}
arr[id + 1] = tmp;
}
}
void bubbleSort(vector<int>& arr)
{
for(int i = 0; i < arr.size(); i++)
{
for(int j = 0; j < arr.size() - i - 1; j++)
{
if(arr[j] > arr[j + 1]) swap(arr[j], arr[j + 1]);
}
}
}
void merge(vector<int>& arr, int left, int mid, int right)
{
vector<int> x(arr.begin() + left, arr.begin() + mid + 1);
vector<int> y(arr.begin() + mid + 1, arr.begin() + right + 1);
int i = 0, j = 0, k = left;
while(i < x.size() && j < y.size())
{
if(x[i] <= y[j]) arr[k++] = x[i++];
else arr[k++] = y[j++];
}
while(i < x.size()) arr[k++] = x[i++];
while(j < y.size()) arr[k++] = y[j++];
}
void mergeSort(vector<int>& arr, int left, int right)
{
if(left >= right) return;
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
int partition(vector<int>& arr, int left, int right)
{
int i = left - 1, tmp = arr[right];
for(int j = left; j < right; j++)
{
if(arr[j] <= tmp) swap(arr[++i], arr[j]);
}
swap(arr[++i], arr[right]);
return i;
}
void quickSort(vector<int>& arr, int left, int right)
{
if(left < right)
{
int p = partition(arr, left, right);
quickSort(arr, left, p - 1);
quickSort(arr, p + 1, right);
}
}
void heapify(vector<int>& arr, int n, int i)
{
int id = i, left = 2 * i + 1, right = 2 * i + 2;
if(left < n && arr[left] > arr[id]) id = left;
if(right < n && arr[right] > arr[id]) id = right;
if(id != i)
{
swap(arr[i], arr[id]);
heapify(arr, n, id);
}
}
void heapSort(vector<int>& arr)
{
int n = arr.size();
for(int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i);
for(int i = n - 1; i > 0; i--)
{
swap(arr[0], arr[i]);
heapify(arr, i, 0);
}
}
void countSort(vector<int>& arr, int exp)
{
vector<int> b(arr.size()), cnt(10, 0);
for(int i = 0; i < arr.size(); i++) cnt[(arr[i] / exp) % 10]++;
for(int i = 1; i < 10; i++) cnt[i] += cnt[i - 1];
for(int i = arr.size() - 1; i >= 0; i--) b[--cnt[(arr[i] / exp) % 10]] = arr[i];
for(int i = 0; i < arr.size(); i++) arr[i] = b[i];
}
void radixSort(vector<int>& arr)
{
int maxx = *max_element(arr.begin(), arr.end());
for(int exp = 1; maxx / exp > 0; exp *= 10) countSort(arr, exp);
}
void printArray(const vector<int>& arr)
{
for(int num : arr) cout << num << " ";
cout << el;
}
int main()
{
Faster;
vector<int> arr = {38, 27, 43, 3, 9, 82, 10};
cout << "Mang ban dau: ";
printArray(arr);
mergeSort(arr, 0, arr.size() - 1);
cout << "Mang sau khi sap xep tron: ";
printArray(arr);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgZWwgIlxuIgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIHVsbCB1bnNpZ25lZCBsb25nIGxvbmcKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIGJlIGJlZ2luKCkKI2RlZmluZSBlbiBlbmQoKQojZGVmaW5lIEZhc3RlciBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKCnZvaWQgc2VsZWN0aW9uU29ydCh2ZWN0b3I8aW50PiYgYXJyKQp7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgYXJyLnNpemUoKTsgaSsrKQogICAgewogICAgICAgIGludCBpZCA9IGk7CiAgICAgICAgZm9yKGludCBqID0gaTsgaiA8IGFyci5zaXplKCk7IGorKykKICAgICAgICB7CiAgICAgICAgICAgIGlmKGFycltqXSA8IGFycltpZF0pIGlkID0gajsKICAgICAgICB9CiAgICAgICAgc3dhcChhcnJbaV0sIGFycltpZF0pOwogICAgfQp9Cgp2b2lkIGluc2VydGlvblNvcnQodmVjdG9yPGludD4mIGFycikKewogICAgZm9yKGludCBpID0gMTsgaSA8IGFyci5zaXplKCk7IGkrKykKICAgIHsKICAgICAgICBpbnQgaWQgPSBpIC0gMSwgdG1wID0gYXJyW2ldOwogICAgICAgIHdoaWxlKGlkID49IDAgJiYgdG1wIDwgYXJyW2lkXSkKICAgICAgICB7CiAgICAgICAgICAgIGFycltpZCArIDFdID0gYXJyW2lkXTsKICAgICAgICAgICAgaWQtLTsKICAgICAgICB9CiAgICAgICAgYXJyW2lkICsgMV0gPSB0bXA7CiAgICB9Cn0KCnZvaWQgYnViYmxlU29ydCh2ZWN0b3I8aW50PiYgYXJyKQp7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgYXJyLnNpemUoKTsgaSsrKQogICAgewogICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBhcnIuc2l6ZSgpIC0gaSAtIDE7IGorKykKICAgICAgICB7CiAgICAgICAgICAgIGlmKGFycltqXSA+IGFycltqICsgMV0pIHN3YXAoYXJyW2pdLCBhcnJbaiArIDFdKTsKICAgICAgICB9CiAgICB9Cn0KCnZvaWQgbWVyZ2UodmVjdG9yPGludD4mIGFyciwgaW50IGxlZnQsIGludCBtaWQsIGludCByaWdodCkKewogICAgdmVjdG9yPGludD4geChhcnIuYmVnaW4oKSArIGxlZnQsIGFyci5iZWdpbigpICsgbWlkICsgMSk7CiAgICB2ZWN0b3I8aW50PiB5KGFyci5iZWdpbigpICsgbWlkICsgMSwgYXJyLmJlZ2luKCkgKyByaWdodCArIDEpOwogICAgaW50IGkgPSAwLCBqID0gMCwgayA9IGxlZnQ7CiAgICB3aGlsZShpIDwgeC5zaXplKCkgJiYgaiA8IHkuc2l6ZSgpKQogICAgewogICAgICAgIGlmKHhbaV0gPD0geVtqXSkgYXJyW2srK10gPSB4W2krK107CiAgICAgICAgZWxzZSBhcnJbaysrXSA9IHlbaisrXTsKICAgIH0KICAgIHdoaWxlKGkgPCB4LnNpemUoKSkgYXJyW2srK10gPSB4W2krK107CiAgICB3aGlsZShqIDwgeS5zaXplKCkpIGFycltrKytdID0geVtqKytdOwp9Cgp2b2lkIG1lcmdlU29ydCh2ZWN0b3I8aW50PiYgYXJyLCBpbnQgbGVmdCwgaW50IHJpZ2h0KQp7CiAgICBpZihsZWZ0ID49IHJpZ2h0KSByZXR1cm47CiAgICBpbnQgbWlkID0gKGxlZnQgKyByaWdodCkgLyAyOwogICAgbWVyZ2VTb3J0KGFyciwgbGVmdCwgbWlkKTsKICAgIG1lcmdlU29ydChhcnIsIG1pZCArIDEsIHJpZ2h0KTsKICAgIG1lcmdlKGFyciwgbGVmdCwgbWlkLCByaWdodCk7Cn0KCmludCBwYXJ0aXRpb24odmVjdG9yPGludD4mIGFyciwgaW50IGxlZnQsIGludCByaWdodCkKewogICAgaW50IGkgPSBsZWZ0IC0gMSwgdG1wID0gYXJyW3JpZ2h0XTsKICAgIGZvcihpbnQgaiA9IGxlZnQ7IGogPCByaWdodDsgaisrKQogICAgewogICAgICAgIGlmKGFycltqXSA8PSB0bXApIHN3YXAoYXJyWysraV0sIGFycltqXSk7CiAgICB9CiAgICBzd2FwKGFyclsrK2ldLCBhcnJbcmlnaHRdKTsKICAgIHJldHVybiBpOwp9Cgp2b2lkIHF1aWNrU29ydCh2ZWN0b3I8aW50PiYgYXJyLCBpbnQgbGVmdCwgaW50IHJpZ2h0KQp7CiAgICBpZihsZWZ0IDwgcmlnaHQpCiAgICB7CiAgICAgICAgaW50IHAgPSBwYXJ0aXRpb24oYXJyLCBsZWZ0LCByaWdodCk7CiAgICAgICAgcXVpY2tTb3J0KGFyciwgbGVmdCwgcCAtIDEpOwogICAgICAgIHF1aWNrU29ydChhcnIsIHAgKyAxLCByaWdodCk7CiAgICB9Cn0KCnZvaWQgaGVhcGlmeSh2ZWN0b3I8aW50PiYgYXJyLCBpbnQgbiwgaW50IGkpCnsKICAgIGludCBpZCA9IGksIGxlZnQgPSAyICogaSArIDEsIHJpZ2h0ID0gMiAqIGkgKyAyOwogICAgaWYobGVmdCA8IG4gJiYgYXJyW2xlZnRdID4gYXJyW2lkXSkgaWQgPSBsZWZ0OwogICAgaWYocmlnaHQgPCBuICYmIGFycltyaWdodF0gPiBhcnJbaWRdKSBpZCA9IHJpZ2h0OwogICAgaWYoaWQgIT0gaSkKICAgIHsKICAgICAgICBzd2FwKGFycltpXSwgYXJyW2lkXSk7CiAgICAgICAgaGVhcGlmeShhcnIsIG4sIGlkKTsKICAgIH0KfQoKdm9pZCBoZWFwU29ydCh2ZWN0b3I8aW50PiYgYXJyKQp7CiAgICBpbnQgbiA9IGFyci5zaXplKCk7CiAgICBmb3IoaW50IGkgPSBuIC8gMiAtIDE7IGkgPj0gMDsgaS0tKSBoZWFwaWZ5KGFyciwgbiwgaSk7CiAgICBmb3IoaW50IGkgPSBuIC0gMTsgaSA+IDA7IGktLSkKICAgIHsKICAgICAgICBzd2FwKGFyclswXSwgYXJyW2ldKTsKICAgICAgICBoZWFwaWZ5KGFyciwgaSwgMCk7CiAgICB9Cn0KCnZvaWQgY291bnRTb3J0KHZlY3RvcjxpbnQ+JiBhcnIsIGludCBleHApCnsKICAgIHZlY3RvcjxpbnQ+IGIoYXJyLnNpemUoKSksIGNudCgxMCwgMCk7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgYXJyLnNpemUoKTsgaSsrKSBjbnRbKGFycltpXSAvIGV4cCkgJSAxMF0rKzsKICAgIGZvcihpbnQgaSA9IDE7IGkgPCAxMDsgaSsrKSBjbnRbaV0gKz0gY250W2kgLSAxXTsKICAgIGZvcihpbnQgaSA9IGFyci5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgYlstLWNudFsoYXJyW2ldIC8gZXhwKSAlIDEwXV0gPSBhcnJbaV07CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgYXJyLnNpemUoKTsgaSsrKSBhcnJbaV0gPSBiW2ldOwp9Cgp2b2lkIHJhZGl4U29ydCh2ZWN0b3I8aW50PiYgYXJyKQp7CiAgICBpbnQgbWF4eCA9ICptYXhfZWxlbWVudChhcnIuYmVnaW4oKSwgYXJyLmVuZCgpKTsKICAgIGZvcihpbnQgZXhwID0gMTsgbWF4eCAvIGV4cCA+IDA7IGV4cCAqPSAxMCkgY291bnRTb3J0KGFyciwgZXhwKTsKfQoKdm9pZCBwcmludEFycmF5KGNvbnN0IHZlY3RvcjxpbnQ+JiBhcnIpCnsKICAgIGZvcihpbnQgbnVtIDogYXJyKSBjb3V0IDw8IG51bSA8PCAiICI7CiAgICBjb3V0IDw8IGVsOwp9CgppbnQgbWFpbigpCnsKICAgIEZhc3RlcjsKICAgIHZlY3RvcjxpbnQ+IGFyciA9IHszOCwgMjcsIDQzLCAzLCA5LCA4MiwgMTB9OwogICAgY291dCA8PCAiTWFuZyBiYW4gZGF1OiAiOwogICAgcHJpbnRBcnJheShhcnIpOwoKICAgIG1lcmdlU29ydChhcnIsIDAsIGFyci5zaXplKCkgLSAxKTsKICAgIGNvdXQgPDwgIk1hbmcgc2F1IGtoaSBzYXAgeGVwIHRyb246ICI7CiAgICBwcmludEFycmF5KGFycik7CgogICAgcmV0dXJuIDA7Cn0K