一、题目描述
给定一个数组,请你编写一个函数,返回该数组排序后的形式。
二、题解+回顾
2.1 本题题解
import java.util.*;
public class Solution {
public int[] MySort (int[] arr) {
Arrays.sort(arr);
return arr;
}
}
上面方法可能最简单了,分析一下Arrays.sort,它并不是单一的排序,而是插入排序,快速排序,归并排序三种排序的组合,会根据数组的长度来选择使用哪个排序。数组小则用插入,数组大则选择用快排或者归并,下面有点结构的意思就是大体上是不是有点顺序的。
2.2 回顾常用排序方法
2.2.1 冒泡排序
原理:相邻元素两两比较,大的往后放
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {
2,1,3,5,6,4};//初始化一个静态数组
System.out.println("排序前:" + Arrays.toString(arr));
bubbleSort(arr);
System.out.println("排序后:" + Arrays.toString(arr));
}
public static void bubbleSort(int[] arr){
int temp = 0;//定义一个辅助变量
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
}
2.2.2 直接插入排序
原理:每步将一个待排序的记录暂存至temp,按其大小插入到前面已经排序的字序列的合适位置
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr = {
2,1,3,5,6,4};//初始化一个静态数组
System.out.println("排序前:" + Arrays.toString(arr));
insertSort(arr);
System.out.println("排序后:" + Arrays.toString(arr));
}
public static void insertSort(int[] arr){
for (int i = 1; i < arr.length; i++) {
int temp = arr[i];//先把arr[i]拿出,与其前面的比较大小
int j = i-1;
while(j >= 0) {
if (arr[j] > temp){
//前面比后面大则后移
arr[j+1] = arr[j];
}else{
break;//跳出的后面就是temp应该插入地方
}
j--;
}
arr[j+1] = temp;
}
}
}
2.2.3 快速排序
众所周知,快排是平均最优的排序方法,我们默认以每次递归最左边为基准
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {
2,1,3,5,6,4};//初始化一个静态数组
System.out.println("排序前:" + Arrays.toString(arr));
quickSort(arr,0,arr.length - 1);
System.out.println("排序后:" + Arrays.toString(arr));
}
public static void quickSort(int[] arr,int low ,int high){
if (low > high){
return;
}
int i = low;
int j = high;
int base = arr[low];//基准
int temp;//辅助变量
while(i < j){
//首先看右边,往左边递减
while (i < j && base <= arr[j]){
j--;
}
while (i < j && base >= arr[i]){
i++;
}
//上面两个循环执行后,就会index为i位置比base大,需要换到右边,index为j比base小,需要换到左边
if (i < j){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//循环跳出i=j,基准再和相等处交换
arr[low] = arr[i];
arr[i] = base;
//递归调用左半数组
quickSort(arr, low, j-1);
//递归调用右半数组
quickSort(arr, j+1, high);
}
}
扫描二维码关注公众号,回复:
12656929 查看本文章

2.2.4 归并排序
原理:归并就是将数组分开再合并的过程
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] arr = {
2,1,3,5,6,4};//初始化一个静态数组
System.out.println("排序前:" + Arrays.toString(arr));
mergeSort(arr,0,arr.length - 1);
System.out.println("排序后:" + Arrays.toString(arr));
}
private static void mergeSort(int[] arr, int low, int high) {
// 分治
if (low < high) {
int mid = (low + high) / 2;
mergeSort(arr, low, mid);//左边
mergeSort(arr, mid + 1, high);//右边
//合并
merge(arr, low, mid, high);
}
}
public static void merge(int[] a, int low, int mid, int high) {
int[] temp = new int[high - low + 1];
int i = low;// 左指针
int j = mid + 1;// 右指针
int k = 0;
// 把较小的数先移到新数组中
while (i <= mid && j <= high) {
if (a[i] < a[j]) {
temp[k++] = a[i++];
} else {
temp[k++] = a[j++];
}
}
// 把左边剩余的数移入数组
while (i <= mid) {
temp[k++] = a[i++];
}
// 把右边边剩余的数移入数组
while (j <= high) {
temp[k++] = a[j++];
}
// 把新数组中的数覆盖nums数组
for (int m = 0; m < temp.length; m++) {
a[m + low] = temp[m];
}
}
}