public class BubbleSort { public static void sort(int[] arr) { int n = arr.length; for (int i = 0; i < n; i++) { // Last i elements are already sorted for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // Swap arr[j] and arr[j+1] int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }}
Optimized Bubble Sort
Add a flag to detect if any swaps occurred in a pass:
public static void bubbleSortOptimized(int[] arr) { int n = arr.length; for (int i = 0; i < n; i++) { boolean swapped = false; for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; swapped = true; } } // If no swaps occurred, array is sorted if (!swapped) break; }}
Selection Sort finds the minimum element and places it at the beginning.
public class SelectionSort { public static void sort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { int minIndex = i; // Find minimum element in unsorted part for (int j = i + 1; j < n; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } // Swap minimum with first unsorted element int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } }}
Insertion Sort builds the sorted array one element at a time.
public class InsertionSort { public static void sort(int[] arr) { int n = arr.length; for (int i = 1; i < n; i++) { int key = arr[i]; int j = i - 1; // Move elements greater than key one position ahead while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } }}
Insertion Sort performs excellently on nearly sorted arrays and is the algorithm of choice for small arrays (typically < 10 elements).
public class QuickSort { public static void sort(int[] arr, int left, int right) { if (left >= right) return; int pivotIndex = partition(arr, left, right); sort(arr, left, pivotIndex - 1); sort(arr, pivotIndex + 1, right); } private static int partition(int[] arr, int left, int right) { int pivot = arr[left]; int j = left; // Last element in smaller partition for (int i = left + 1; i <= right; i++) { if (arr[i] < pivot) { j++; swap(arr, i, j); } } swap(arr, left, j); return j; } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }}
Quick Sort Process Explanation
Given array [3, 1, 5, 6, 2]:
Choose pivot (3)
Partition: elements < pivot go left, >= pivot go right
public class HeapSort { public static void sort(int[] arr) { int n = arr.length; // Build max heap for (int i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i); } // Extract elements from heap one by one for (int i = n - 1; i > 0; i--) { swap(arr, 0, i); heapify(arr, i, 0); } } private static void heapify(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) { swap(arr, i, largest); heapify(arr, n, largest); } } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }}
Shell Sort is an optimization of Insertion Sort using gap sequences.
public class ShellSort { public static void sort(int[] arr) { int n = arr.length; // Start with large gap, reduce by half each iteration for (int gap = n / 2; gap > 0; gap /= 2) { for (int i = gap; i < n; i++) { int temp = arr[i]; int j = i; while (j >= gap && arr[j - gap] > temp) { arr[j] = arr[j - gap]; j -= gap; } arr[j] = temp; } } }}