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;
}
}