//
//  main.cpp
//  Sorting Algorithms
//
//  Created by Himanshu on 21/09/21.
//

#include <iostream>
using namespace std;

void printArray (int arr[], int n) {
    for (int i=0; i<n; i++) {
        cout<<arr[i]<<" ";
    }
    cout<<endl;
}


void BubbleSort (int arr[], int n) {
    for (int i=0; i<n; i++) {
        for (int j=0; j<n-i-1; j++) {
            if (arr[j+1] < arr[j]) {
                swap (arr[j], arr[j+1]);
            }
        }
        printf("Array after %d iteration: \n", i+1);
        printArray(arr, n);
    }
}

void InsertionSort (int arr[], int n) {
    for (int i=1; i<n; i++) {
        int j = i;
        while (j>0 && arr[j-1] > arr[j]) {
            swap (arr[j-1], arr[j]);
            j--;
        }
        printf("Array after %d iteration: \n", i);
        printArray(arr, n);
  }
}

void SelectionSort (int arr[], int n) {
  for (int i=0; i<n; i++) {
      int indexMin = i;
      for (int j = i+1; j<n; j++) {
         if (arr[j] < arr[indexMin]) {
            indexMin = j;
         }
      }
      if (indexMin != i) {
         swap (arr[indexMin], arr[i]);
      }
      printf("Array after %d iteration: \n", i+1);
      printArray(arr, n);
  }
}

int main () {
    int arr1[5] = {5, 3, 2, 4, 1};
    int arr2[5] = {5, 3, 2, 4, 1};
    int arr3[5] = {5, 3, 2, 4, 1};
    int n = 5;
    
    cout<<"Bubble Sort:"<<endl;
    BubbleSort (arr1, n);
    
    cout<<endl<<"Insertion Sort:"<<endl;
    InsertionSort (arr2, n);
    
    cout<<endl<<"Selection Sort:"<<endl;
    SelectionSort (arr3, n);
    
    return 0;
}
