#include <iostream>
#include <vector>
#include <cstdlib> // для rand(), srand()
#include <ctime> // для time()
#include <algorithm> // для swap()
using namespace std;
// --- 1. ПУЗЫРЬКОВАЯ СОРТИРОВКА (простой обмен) ---
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]);
}
}
}
}
// --- 2. СОРТИРОВКА ПРОСТЫМ ВЫБОРОМ ---
void selectionSort(vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n - 1; i++) {
int min_idx = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[min_idx]) {
min_idx = j;
}
}
swap(arr[min_idx], arr[i]);
}
}
// --- 3. СОРТИРОВКА ПРОСТЫМИ ВСТАВКАМИ ---
void insertionSort(vector<int>& arr) {
int n = arr.size();
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
// --- 4. СОРТИРОВКА ШЕЛЛА ---
void shellSort(vector<int>& arr) {
int n = arr.size();
for (int gap = n / 2; gap > 0; gap /= 2) {
for (int i = gap; i < n; i++) {
int temp = arr[i];
int j;
for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
arr[j] = arr[j - gap];
}
arr[j] = temp;
}
}
}
// --- ФУНКЦИЯ ВЫВОДА МАССИВА НА ЭКРАН ---
void printArray(const vector<int>& arr) {
for (int x : arr) cout << x << " ";
cout << endl;
}
// --- ГЛАВНАЯ ФУНКЦИЯ ---
int main() {
srand(time(0)); // Инициализация генератора случайных чисел
int n;
cout << "Введите размер массива: ";
cin >> n;
vector<int> original(n);
// --- ВЫБОР СПОСОБА ЗАПОЛНЕНИЯ ---
int choice;
cout << "\nКак заполнить массив?\n";
cout << "1 - Ввести числа вручную\n";
cout << "2 - Заполнить случайными числами\n";
cout << "Ваш выбор: ";
cin >> choice;
if (choice == 1) {
cout << "Введите " << n << " чисел через пробел: ";
for (int i = 0; i < n; i++) {
cin >> original[i];
}
} else {
for (int i = 0; i < n; i++) {
original[i] = rand() % 100; // числа от 0 до 99
}
cout << "Массив заполнен случайными числами.\n";
}
// --- ВЫВОД ИСХОДНОГО МАССИВА ---
cout << "\nИсходный массив: ";
printArray(original);
// --- ПРОГОНЯЕМ ЧЕРЕЗ ВСЕ 4 СОРТИРОВКИ ---
vector<int> temp; // временный массив для копирования
cout << "\n========== РЕЗУЛЬТАТЫ СОРТИРОВОК ==========\n";
// 1. Пузырьковая
temp = original;
bubbleSort(temp);
cout << "\n1. Пузырьковая (простой обмен):\n ";
printArray(temp);
// 2. Простым выбором
temp = original;
selectionSort(temp);
cout << "\n2. Простым выбором:\n ";
printArray(temp);
// 3. Простыми вставками
temp = original;
insertionSort(temp);
cout << "\n3. Простыми вставками:\n ";
printArray(temp);
// 4. Шелла
temp = original;
shellSort(temp);
cout << "\n4. Шелла:\n ";
printArray(temp);
cout << "\n===========================================\n";
return 0;
}