描述
示例1
输入:[5,2,3,1,4]返回值:[1,2,3,4,5]
备注:
数组的长度不大于100000,数组中每个数的绝对值不超过10^9
//提供四种排序思想public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可* 将给定数组排序* @param arr int整型一维数组 待排序的数组* @return int整型一维数组*/public int[] MySort (int[] arr) {// write code herequickSort(arr);return arr;}//交换两个数组元素public void swapArr(int[] arr,int index1,int index2) {int i = arr[index2];arr[index2] = arr[index1];arr[index1] = i;}//选择排序public void selectionSort(int[] arr) {for(int i = 0;i<arr.length;i++) {//寻找(i,arr.length]之间的最小值int minIndex = i;for(int j = i+1;j<arr.length;j++) {if(arr[j]<arr[minIndex]) {minIndex = j;}}swapArr(arr,i,minIndex);}}//将arr[l..mid] 和 arr[mid+1 ... r]两部分进行归并private static void __merge(int[] arr,int l,int mid, int r) {int[] aux = new int[r-l+1];//将排序的空间赋值给auxint i;for(i = l;i <= r;i++) {aux[i-l] = arr[i];}i=l;int j = mid+1;//归并排序for(int k = l;k <= r;k++) {//1 看i j 是否越界if(i>mid) {arr[k] = aux[j-l];j++;}else if(j>r) {arr[k] = aux[i-l];i++;}else {if(aux[i-l]<aux[j-l]) {arr[k] = aux[i-l];i++;}else {arr[k] = aux[j-l];j++;}}}}//递归使用归并排序,对arr[l..r] 的范围进行排序private static void __mergeSort(int[] arr,int l,int r) {//结束条件if(l >= r) {return;}//求中点位置int mid = (l+r)/2;__mergeSort(arr,l,mid);__mergeSort(arr,mid+1,r);//进行最后排序__merge(arr,l,mid,r);}//归并排序public static void mergeSort(int[] arr) {//对arr[l..r] 的范围进行排序__mergeSort(arr,0,(arr.length)-1);}//对arr[l...r] 部分进行partiton 操作//返回p 使得arr[l...p-1] <arr[p] arr[p+1 ...r] >arr[p]private int __partition(int[] arr,int l, int r) {int v = arr[l];// j的值指向第一个大于V的值的下标int j = l+1;// 遍历整个数组 一直到 i<= r 时候结束for(int i = l+1;i<=r;i++) {if(arr[i] < v) {swapArr(arr, i,j);j++;}}swapArr(arr, l, j-1);return j-1;}//对arr[l...r] 部分进行快速排序private void __quickSort(int[] arr,int l,int r) {if(l>=r) {return;}int p = __partition(arr,l,r);__quickSort(arr, l, p-1);__quickSort(arr, p+1, r);}//快速排序public void quickSort(int[] arr) {__quickSort(arr,0,arr.length-1);}private void __quickSort3Ways(int[] arr,int l,int r) {if(r-l<=15) {insertionSort(arr);return;}Random ra = new Random();swapArr(arr, l, ra.nextInt(r-l)+l);int v = arr[l];//__partition3Ways(arr,r,l);//partiton3Waysint lt = l;int gt = r;int i = l+1;while(i<gt){if(arr[i]>v) {swapArr(arr, i, gt);gt--;}else if(arr[i]<v) {swapArr(arr, i, lt+1);i++;lt++;}else {i++;}}swapArr(arr, l, lt);__quickSort3Ways(arr,l,lt-1);__quickSort3Ways(arr,gt,r);}//三路快速排序public void quickSort3Ways(int[] arr) {__quickSort3Ways(arr,0,arr.length-1);}//插入排序public void insertionSort(int[] arr) {for(int i = 1; i<arr.length;i++) {//寻找元素arr[i]合适的插入位置int j;for(j = i;j>0;j--) {if(arr[j] < arr[j-1]) {//使用交换 需要赋值三次swapArr(arr, j, j-1);}else {break;}}}}}

