import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 将给定数组排序
     * @param arr int整型一维数组 待排序的数组
     * @return int整型一维数组
     */
    public int[] MySort (int[] arr) {
        //return bubbleSort1(arr);
        //return bubbleSort2(arr);
        //return bubbleSort3(arr);
        //return insertSort(arr);
        //return mergeSort(arr);
        return quickSort(arr);
    }
    private void swap(int[] arr, int i, int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }
// ====== 冒泡排序 ======
    private int[] bubbleSort1(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[i]) {
                    swap(arr, i, j);
                }
            }
        }
        return arr;
    }
    private int[] bubbleSort2(int[] arr) {
        for (int i = arr.length - 1; i > 0; i--) {
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr, j, j + 1);
                }
            }
        }
        return arr;
    }
    // 最优版本
    private int[] bubbleSort3(int[] arr) {
        for (int i = arr.length - 1; i > 0; i--) {
            boolean flag = false;
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr, j, j + 1);
                    flag = true;
                }
            }
            if (!flag)break;
        }
        return arr;
    }
// ===== 插入排序 =====
    private int[] insertSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int insertVal = arr[i];
            int index = i - 1;
            while (index >= 0 && insertVal < arr[index]) {
                arr[index + 1] = arr[index];
                index--;
            }
            if (index + 1 != i) {
                arr[index + 1] = insertVal;
            }
        }
        return arr;
    }
// ===== 选择排序 =====
    private int[] selectSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            if (minIndex == i)continue;
            swap(arr, minIndex, i);
        }
        return arr;
    }
// ===== 归并排序 =====
    private int[] mergeSort(int[] arr) {
        if (arr == null || arr.length <= 1)return arr;
        int[] temp = new int[arr.length];
        mergeSortPart(arr, 0, arr.length - 1, temp);
        return arr;
    }
    // 分区
    private void mergeSortPart(int[] arr, int left, int right, int[] temp) {
        if (left >= right)return;
        int mid = left + (right - left) / 2; // 从中间对半分
        mergeSortPart(arr, left, mid, temp);
        mergeSortPart(arr, mid + 1, right, temp);
        if (arr[mid] <= arr[mid + 1])return; // 已经有序,不用再合并
        merge(arr, left, mid, right, temp);
    }
    // 合并两个分区
    private void merge(int[] arr, int left, int mid, int right, int[] temp) {
        int i = left, j = mid + 1, k = 0;
        while (i <= mid && j <= right) {
            if (arr[i] <= arr[j]) {
                temp[k++] = arr[i++];
            } else {
                temp[k++] = arr[j++];
            }
        }
        while (i <= mid) {
            temp[k++] = arr[i++];
        }
        while (j <= right) {
            temp[k++] = arr[j++];
        }
        System.arraycopy(temp, 0, arr, left,
                         k); // 注意要从arr的left下标位置开始拷贝
    }
// ===== 快速排序 =====
    private int[] quickSort(int[] arr) {
        quickSort(arr, 0, arr.length - 1);
        return arr;
    }
    private void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            int pos = partiation(arr, low, high);
            quickSort(arr, low, pos - 1);
            quickSort(arr, pos + 1, high);
        }
    }
    private int partiation(int[] arr, int low, int high) {
        int pv = arr[low];
        int i = low + 1, j = high;
        // 保证基准元素左侧的元素都比他小,右侧的元素都比他大
        while (i <= j) {
            while (i <= j && arr[i] < pv) {
                i++;
            }
            while (i <= j && arr[j] > pv) {
                j--;
            }
            if (i <= j) {
                swap(arr, i, j);
                i++;
                j--;
            }
        }
        // 将基准元素放在正确的位置
        swap(arr, low, j);
        return j;
    }
}