Sorting Algorithms
Introduction to Sorting
Sorting algorithms arrange elements in a particular order, typically ascending or descending. Understanding sorting is fundamental to computer science and algorithm design.
Bubble Sort
Bubble sort repeatedly steps through the list, compares adjacent elements and swaps them if they are in the wrong order. Time complexity: O(n²)
Bubble Sort Implementation
#include <iostream>
#include <vector>
using namespace std;
void bubbleSort(vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n - 1; i++) {
bool swapped = false;
// Last i elements are already sorted
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr[j], arr[j + 1]);
swapped = true;
}
}
// If no swapping occurred, array is sorted
if (!swapped) break;
}
}
int main() {
vector<int> arr = {64, 34, 25, 12, 22, 11, 90};
cout << "Original array: ";
for (int x : arr) cout << x << " ";
cout << endl;
bubbleSort(arr);
cout << "Sorted array: ";
for (int x : arr) cout << x << " ";
cout << endl;
return 0;
}Selection Sort
Selection sort finds the minimum element and places it at the beginning, then finds the second minimum, and so on. Time complexity: O(n²)
Selection Sort Implementation
#include <iostream>
#include <vector>
using namespace std;
void selectionSort(vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
// Find minimum element in remaining array
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// Swap minimum element with first element
if (minIndex != i) {
swap(arr[i], arr[minIndex]);
}
}
}
int main() {
vector<int> arr = {64, 34, 25, 12, 22, 11, 90};
cout << "Original array: ";
for (int x : arr) cout << x << " ";
cout << endl;
selectionSort(arr);
cout << "Sorted array: ";
for (int x : arr) cout << x << " ";
cout << endl;
return 0;
}Quick Sort
Quick sort uses divide-and-conquer to pick a pivot element and partition the array. Average time complexity: O(n log n), worst case: O(n²)
Quick Sort Implementation
#include <iostream>
#include <vector>
using namespace std;
int partition(vector<int>& arr, int low, int high) {
int pivot = arr[high]; // Choose last element as pivot
int i = low - 1; // Index of smaller element
for (int j = low; j < high; j++) {
if (arr[j] <= pivot) {
i++;
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);
// Recursively sort elements before and after partition
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main() {
vector<int> arr = {64, 34, 25, 12, 22, 11, 90};
cout << "Original array: ";
for (int x : arr) cout << x << " ";
cout << endl;
quickSort(arr, 0, arr.size() - 1);
cout << "Sorted array: ";
for (int x : arr) cout << x << " ";
cout << endl;
return 0;
}Merge Sort
Merge sort divides the array into halves, sorts them recursively, and then merges the sorted halves. Time complexity: O(n log n) - stable and predictable.
Merge Sort Implementation
#include <iostream>
#include <vector>
using namespace std;
void merge(vector<int>& arr, int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
// Create temporary arrays
vector<int> L(n1), R(n2);
// Copy data to temporary arrays
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];
// Merge the temporary arrays back
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++;
}
// Copy remaining elements
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
void mergeSort(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);
}
}
int main() {
vector<int> arr = {64, 34, 25, 12, 22, 11, 90};
cout << "Original array: ";
for (int x : arr) cout << x << " ";
cout << endl;
mergeSort(arr, 0, arr.size() - 1);
cout << "Sorted array: ";
for (int x : arr) cout << x << " ";
cout << endl;
return 0;
}Complexity Comparison
| Algorithm | Best Case | Average Case | Worst Case | Space Complexity |
|---|---|---|---|---|
| Bubble Sort | O(n) | O(n²) | O(n²) | O(1) |
| Selection Sort | O(n²) | O(n²) | O(n²) | O(1) |
| Quick Sort | O(n log n) | O(n log n) | O(n²) | O(log n) |
| Merge Sort | O(n log n) | O(n log n) | O(n log n) | O(n) |