#include <chrono> // Включване на библиотеката за измерване на време с висока точност.
#include <iostream>
using namespace std; // Използване на стандартното именно пространство, което позволява използването на общи функции без да указваме std::.
using namespace chrono; // Използване на chrono именно пространство за лесен достъп до функции за време.
// Прототипи на функциите за сортиране, които се дефинират по-надолу в кода.
void bubbleSort(int arr[], int n); // Прототип на функцията за сортиране с Bubble Sort.
void insertionSort(int arr[], int n); // Прототип на функцията за сортиране с Insertion Sort.
int main() {
cout << "vavedi 10 chisla: "; // Изход на екран за инструкция към потребителя.
const int N = 10; // Декларация на променлива за броя елементи в масива.
int arr[N]; // Деклариране на масив с фиксиран размер N.
for (int i = 0; i < N; i++) {
cin >> arr[i]; // Вход от потребителя за всеки елемент на масива.
}
int arrCopy[N]; // Деклариране на копие на масива за да се използва от втория алгоритъм за сортиране.
copy(arr, arr + N, arrCopy); // Копиране на стойностите от оригиналния масив в копието.
// Измерване на времето за Bubble Sort
auto start = high_resolution_clock::now(); // Записване на текущото време преди започване на сортирането с Bubble Sort.
bubbleSort(arr, N); // Изпълнение на Bubble Sort.
auto end = high_resolution_clock::now(); // Записване на времето след приключване на сортирането с Bubble Sort.
// Измерване на изминалото време в наносекунди.
auto bubbleSortTime = duration_cast<nanoseconds>(end - start).count();
// Показване на времето за Bubble Sort.
cout << "Bubble Sort time: " << bubbleSortTime << " nanosec." << endl;
// Измерване на времето за Insertion Sort
start = high_resolution_clock::now(); // Записване на текущото време преди започване на сортирането с Insertion Sort.
insertionSort(arrCopy, N); // Изпълнение на Insertion Sort.
end = high_resolution_clock::now(); // Записване на времето след приключване на сортирането с Insertion Sort.
// Измерване на изминалото време в наносекунди.
auto insertionSortTime = duration_cast<nanoseconds>(end - start).count();
// Показване на времето за Insertion Sort.
cout << "Insertion Sort time : " << insertionSortTime << " nansec." << endl;
// Връщане на 0 като статус за успешно завършване на програмата.
return 0;
}
// Дефиниция на функцията за Bubble Sort
void bubbleSort(int arr[], int n) {
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]); // Размяна ако текущият елемент е по-голям от следващия.
}
}
}
}
// Дефиниция на функцията за Insertion Sort
void insertionSort(int arr[], int n) {
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; // Вмъкване на ключа на правилното място.
}
}