Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <chrono>
- // Kaizer here. I implemented and compared different sorting algorithms using 3 main ones. quicksort, mergesort, and heapsort, in terms of performance.
- // function to print an array
- void printArray(const std::vector<int>& arr) {
- for (int num : arr) {
- std::cout << num << " ";
- }
- std::cout << std::endl;
- }
- // quicksort implementation
- int partition(std::vector<int>& arr, int low, int high) {
- int pivot = arr[high];
- int i = low - 1;
- for (int j = low; j < high; j++) {
- if (arr[j] < pivot) {
- i++;
- std::swap(arr[i], arr[j]);
- }
- }
- std::swap(arr[i + 1], arr[high]);
- return i + 1;
- }
- void quicksort(std::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);
- }
- }
- // mergesort implementation
- void merge(std::vector<int>& arr, int left, int mid, int right) {
- int n1 = mid - left + 1;
- int n2 = right - mid;
- std::vector<int> L(n1), R(n2);
- for (int i = 0; i < n1; i++)
- L[i] = arr[left + i];
- for (int j = 0; j < n2; j++)
- R[j] = arr[mid + 1 + j];
- int i = 0, j = 0, k = left;
- while (i < n1 && j < n2) {
- if (L[i] <= R[j]) {
- arr[k] = L[i];
- i++;
- } else {
- arr[k] = R[j];
- j++;
- }
- k++;
- }
- while (i < n1) {
- arr[k] = L[i];
- i++;
- k++;
- }
- while (j < n2) {
- arr[k] = R[j];
- j++;
- k++;
- }
- }
- void mergesort(std::vector<int>& arr, int left, int right) {
- if (left < right) {
- int mid = left + (right - left) / 2;
- mergesort(arr, left, mid);
- mergesort(arr, mid + 1, right);
- merge(arr, left, mid, right);
- }
- }
- // heapsort implementation
- void heapify(std::vector<int>& arr, int n, int i) {
- int largest = i;
- int left = 2 * i + 1;
- int right = 2 * i + 2;
- if (left < n && arr[left] > arr[largest])
- largest = left;
- if (right < n && arr[right] > arr[largest])
- largest = right;
- if (largest != i) {
- std::swap(arr[i], arr[largest]);
- heapify(arr, n, largest);
- }
- }
- void heapsort(std::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--) {
- std::swap(arr[0], arr[i]);
- heapify(arr, i, 0);
- }
- }
- // function to measure and compare sorting times
- void compareSorts(std::vector<int> arr) {
- std::vector<int> arr1 = arr;
- std::vector<int> arr2 = arr;
- std::vector<int> arr3 = arr;
- auto start = std::chrono::high_resolution_clock::now();
- quicksort(arr1, 0, arr1.size() - 1);
- auto end = std::chrono::high_resolution_clock::now();
- std::chrono::duration<double> quicksortTime = end - start;
- std::cout << "Quicksort time: " << quicksortTime.count() << " seconds" << std::endl;
- start = std::chrono::high_resolution_clock::now();
- mergesort(arr2, 0, arr2.size() - 1);
- end = std::chrono::high_resolution_clock::now();
- std::chrono::duration<double> mergesortTime = end - start;
- std::cout << "Mergesort time: " << mergesortTime.count() << " seconds" << std::endl;
- start = std::chrono::high_resolution_clock::now();
- heapsort(arr3);
- end = std::chrono::high_resolution_clock::now();
- std::chrono::duration<double> heapsortTime = end - start;
- std::cout << "Heapsort time: " << heapsortTime.count() << " seconds" << std::endl;
- }
- int main() {
- std::vector<int> arr = {12, 11, 13, 5, 6, 7};
- std::cout << "Original array: ";
- printArray(arr);
- compareSorts(arr);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement