#include <bits/stdc++.h>
using namespace std;
using namespace chrono;
void bubbleSort(vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n - i - 1; j++)
if (arr[j] > arr[j + 1])
swap(arr[j], arr[j + 1]);
}
void selectionSort(vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n - 1; i++) {
int minIdx = i;
for (int j = i + 1; j < n; j++)
if (arr[j] < arr[minIdx])
minIdx = j;
swap(arr[minIdx], arr[i]);
}
}
void insertionSort(vector<int>& arr) {
int n = arr.size();
for (int i = 1; i < n; i++) {
int key = arr[i], j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
void merge(vector<int>& arr, int l, int m, int r) {
int n1 = m - l + 1, n2 = r - m;
vector<int> L(n1), R(n2);
for (int i = 0; i < n1; i++) L[i] = arr[l + i];
for (int i = 0; i < n2; i++) R[i] = arr[m + 1 + i];
int i = 0, j = 0, k = l;
while (i < n1 && j < n2) arr[k++] = (L[i] < R[j]) ? L[i++] : R[j++];
while (i < n1) arr[k++] = L[i++];
while (j < n2) arr[k++] = R[j++];
}
void mergeSort(vector<int>& arr, int l, int r) {
if (l >= r) return;
int m = l + (r - l) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
merge(arr, l, m, r);
}
int partition(vector<int>& arr, int low, int high) {
int pivot = arr[high], i = low - 1;
for (int j = low; j < high; j++)
if (arr[j] < pivot)
swap(arr[++i], arr[j]);
swap(arr[i + 1], arr[high]);
return i + 1;
}
void quickSort(vector<int>& arr, int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
void heapify(vector<int>& arr, int n, int i) {
int largest = i, l = 2 * i + 1, r = 2 * i + 2;
if (l < n && arr[l] > arr[largest]) largest = l;
if (r < n && arr[r] > arr[largest]) largest = r;
if (largest != i) {
swap(arr[i], arr[largest]);
heapify(arr, n, largest);
}
}
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 measureTime(void (*sortFunc)(vector<int>&), vector<int> arr, string name) {
auto start = high_resolution_clock::now();
sortFunc(arr);
auto stop = high_resolution_clock::now();
auto duration = duration_cast<milliseconds>(stop - start);
cout << name << ": " << duration.count() << " ms\n";
}
int main() {
vector<int> arr(10000);
iota(arr.begin(), arr.end(), 1);
random_shuffle(arr.begin(), arr.end());
measureTime(bubbleSort, arr, "Bubble Sort");
measureTime(selectionSort, arr, "Selection Sort");
measureTime(insertionSort, arr, "Insertion Sort");
measureTime([](vector<int>& a) { mergeSort(a, 0, a.size() - 1); }, arr, "Merge Sort");
measureTime([](vector<int>& a) { quickSort(a, 0, a.size() - 1); }, arr, "Quick Sort");
measureTime(heapSort, arr, "Heap Sort");
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIG5hbWVzcGFjZSBjaHJvbm87Cgp2b2lkIGJ1YmJsZVNvcnQodmVjdG9yPGludD4mIGFycikgewogICAgaW50IG4gPSBhcnIuc2l6ZSgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuIC0gMTsgaSsrKQogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbiAtIGkgLSAxOyBqKyspCiAgICAgICAgICAgIGlmIChhcnJbal0gPiBhcnJbaiArIDFdKQogICAgICAgICAgICAgICAgc3dhcChhcnJbal0sIGFycltqICsgMV0pOwp9Cgp2b2lkIHNlbGVjdGlvblNvcnQodmVjdG9yPGludD4mIGFycikgewogICAgaW50IG4gPSBhcnIuc2l6ZSgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuIC0gMTsgaSsrKSB7CiAgICAgICAgaW50IG1pbklkeCA9IGk7CiAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbjsgaisrKQogICAgICAgICAgICBpZiAoYXJyW2pdIDwgYXJyW21pbklkeF0pCiAgICAgICAgICAgICAgICBtaW5JZHggPSBqOwogICAgICAgIHN3YXAoYXJyW21pbklkeF0sIGFycltpXSk7CiAgICB9Cn0KCnZvaWQgaW5zZXJ0aW9uU29ydCh2ZWN0b3I8aW50PiYgYXJyKSB7CiAgICBpbnQgbiA9IGFyci5zaXplKCk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykgewogICAgICAgIGludCBrZXkgPSBhcnJbaV0sIGogPSBpIC0gMTsKICAgICAgICB3aGlsZSAoaiA+PSAwICYmIGFycltqXSA+IGtleSkgewogICAgICAgICAgICBhcnJbaiArIDFdID0gYXJyW2pdOwogICAgICAgICAgICBqLS07CiAgICAgICAgfQogICAgICAgIGFycltqICsgMV0gPSBrZXk7CiAgICB9Cn0KCnZvaWQgbWVyZ2UodmVjdG9yPGludD4mIGFyciwgaW50IGwsIGludCBtLCBpbnQgcikgewogICAgaW50IG4xID0gbSAtIGwgKyAxLCBuMiA9IHIgLSBtOwogICAgdmVjdG9yPGludD4gTChuMSksIFIobjIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuMTsgaSsrKSBMW2ldID0gYXJyW2wgKyBpXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjI7IGkrKykgUltpXSA9IGFyclttICsgMSArIGldOwogICAgaW50IGkgPSAwLCBqID0gMCwgayA9IGw7CiAgICB3aGlsZSAoaSA8IG4xICYmIGogPCBuMikgYXJyW2srK10gPSAoTFtpXSA8IFJbal0pID8gTFtpKytdIDogUltqKytdOwogICAgd2hpbGUgKGkgPCBuMSkgYXJyW2srK10gPSBMW2krK107CiAgICB3aGlsZSAoaiA8IG4yKSBhcnJbaysrXSA9IFJbaisrXTsKfQoKdm9pZCBtZXJnZVNvcnQodmVjdG9yPGludD4mIGFyciwgaW50IGwsIGludCByKSB7CiAgICBpZiAobCA+PSByKSByZXR1cm47CiAgICBpbnQgbSA9IGwgKyAociAtIGwpIC8gMjsKICAgIG1lcmdlU29ydChhcnIsIGwsIG0pOwogICAgbWVyZ2VTb3J0KGFyciwgbSArIDEsIHIpOwogICAgbWVyZ2UoYXJyLCBsLCBtLCByKTsKfQoKaW50IHBhcnRpdGlvbih2ZWN0b3I8aW50PiYgYXJyLCBpbnQgbG93LCBpbnQgaGlnaCkgewogICAgaW50IHBpdm90ID0gYXJyW2hpZ2hdLCBpID0gbG93IC0gMTsKICAgIGZvciAoaW50IGogPSBsb3c7IGogPCBoaWdoOyBqKyspCiAgICAgICAgaWYgKGFycltqXSA8IHBpdm90KQogICAgICAgICAgICBzd2FwKGFyclsrK2ldLCBhcnJbal0pOwogICAgc3dhcChhcnJbaSArIDFdLCBhcnJbaGlnaF0pOwogICAgcmV0dXJuIGkgKyAxOwp9Cgp2b2lkIHF1aWNrU29ydCh2ZWN0b3I8aW50PiYgYXJyLCBpbnQgbG93LCBpbnQgaGlnaCkgewogICAgaWYgKGxvdyA8IGhpZ2gpIHsKICAgICAgICBpbnQgcGkgPSBwYXJ0aXRpb24oYXJyLCBsb3csIGhpZ2gpOwogICAgICAgIHF1aWNrU29ydChhcnIsIGxvdywgcGkgLSAxKTsKICAgICAgICBxdWlja1NvcnQoYXJyLCBwaSArIDEsIGhpZ2gpOwogICAgfQp9Cgp2b2lkIGhlYXBpZnkodmVjdG9yPGludD4mIGFyciwgaW50IG4sIGludCBpKSB7CiAgICBpbnQgbGFyZ2VzdCA9IGksIGwgPSAyICogaSArIDEsIHIgPSAyICogaSArIDI7CiAgICBpZiAobCA8IG4gJiYgYXJyW2xdID4gYXJyW2xhcmdlc3RdKSBsYXJnZXN0ID0gbDsKICAgIGlmIChyIDwgbiAmJiBhcnJbcl0gPiBhcnJbbGFyZ2VzdF0pIGxhcmdlc3QgPSByOwogICAgaWYgKGxhcmdlc3QgIT0gaSkgewogICAgICAgIHN3YXAoYXJyW2ldLCBhcnJbbGFyZ2VzdF0pOwogICAgICAgIGhlYXBpZnkoYXJyLCBuLCBsYXJnZXN0KTsKICAgIH0KfQoKdm9pZCBoZWFwU29ydCh2ZWN0b3I8aW50PiYgYXJyKSB7CiAgICBpbnQgbiA9IGFyci5zaXplKCk7CiAgICBmb3IgKGludCBpID0gbiAvIDIgLSAxOyBpID49IDA7IGktLSkKICAgICAgICBoZWFwaWZ5KGFyciwgbiwgaSk7CiAgICBmb3IgKGludCBpID0gbiAtIDE7IGkgPiAwOyBpLS0pIHsKICAgICAgICBzd2FwKGFyclswXSwgYXJyW2ldKTsKICAgICAgICBoZWFwaWZ5KGFyciwgaSwgMCk7CiAgICB9Cn0KCnZvaWQgbWVhc3VyZVRpbWUodm9pZCAoKnNvcnRGdW5jKSh2ZWN0b3I8aW50PiYpLCB2ZWN0b3I8aW50PiBhcnIsIHN0cmluZyBuYW1lKSB7CiAgICBhdXRvIHN0YXJ0ID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIHNvcnRGdW5jKGFycik7CiAgICBhdXRvIHN0b3AgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogICAgYXV0byBkdXJhdGlvbiA9IGR1cmF0aW9uX2Nhc3Q8bWlsbGlzZWNvbmRzPihzdG9wIC0gc3RhcnQpOwogICAgY291dCA8PCBuYW1lIDw8ICI6ICIgPDwgZHVyYXRpb24uY291bnQoKSA8PCAiIG1zXG4iOwp9CgppbnQgbWFpbigpIHsKICAgIHZlY3RvcjxpbnQ+IGFycigxMDAwMCk7CiAgICBpb3RhKGFyci5iZWdpbigpLCBhcnIuZW5kKCksIDEpOwogICAgcmFuZG9tX3NodWZmbGUoYXJyLmJlZ2luKCksIGFyci5lbmQoKSk7CgogICAgbWVhc3VyZVRpbWUoYnViYmxlU29ydCwgYXJyLCAiQnViYmxlIFNvcnQiKTsKICAgIG1lYXN1cmVUaW1lKHNlbGVjdGlvblNvcnQsIGFyciwgIlNlbGVjdGlvbiBTb3J0Iik7CiAgICBtZWFzdXJlVGltZShpbnNlcnRpb25Tb3J0LCBhcnIsICJJbnNlcnRpb24gU29ydCIpOwogICAgbWVhc3VyZVRpbWUoW10odmVjdG9yPGludD4mIGEpIHsgbWVyZ2VTb3J0KGEsIDAsIGEuc2l6ZSgpIC0gMSk7IH0sIGFyciwgIk1lcmdlIFNvcnQiKTsKICAgIG1lYXN1cmVUaW1lKFtdKHZlY3RvcjxpbnQ+JiBhKSB7IHF1aWNrU29ydChhLCAwLCBhLnNpemUoKSAtIDEpOyB9LCBhcnIsICJRdWljayBTb3J0Iik7CiAgICBtZWFzdXJlVGltZShoZWFwU29ydCwgYXJyLCAiSGVhcCBTb3J0Iik7CgogICAgcmV0dXJuIDA7Cn0K