public class BubbleSort {
    /**
     * Sorts an array of integers using the optimized Bubble Sort algorithm.
     * Time Complexity: O(n^2) worst/average, O(n) best case.
     * Space Complexity: O(1).
     *
     * @param array The array to be sorted.
     */
    public static void sort(int[] array) {
        if (array == null || array.length <= 1) {
            return;
        }
        int n = array.length;
        boolean swapped;
        for (int i = 0; i < n - 1; i++) {
            swapped = false;
            for (int j = 0; j < n - i - 1; j++) {
                if (array[j] > array[j + 1]) {
                    // Swap elements
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    swapped = true;
                }
            }
            // If no elements were swapped in the inner loop, the array is sorted
            if (!swapped) {
                break;
            }
        }
    }

    public static void main(String[] args) {
        int[] data = {64, 34, 25, 12, 22, 11, 90};
        sort(data);
        for (int i : data) {
            System.out.print(i + " ");
        }
    }
}