牛客高频Top200---排序(题解+常用排序方法回顾 java)

一、题目描述

给定一个数组,请你编写一个函数,返回该数组排序后的形式。
在这里插入图片描述

二、题解+回顾

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39615182/article/details/114275883