算法基础学习——快排与归并(附带java模版)

快速排序和归并排序是两种速度较快的排序方式,是最应该掌握的两种排序算法,

(一)快速排序(不稳定的)

基本思想:分治

平均时间复杂度:O(nlogn) / 最慢O(n^2) / 最快O(n)

步骤:
  • 1.确定分界点;

  • 2.调整区间;(分界点右的元素全都小于等于分界点、左边全都大于等于分界点)

  • 3.递归的处理左右两段;

模板:
java 复制代码
public static int[] quickSort(int[] arr,int l,int r){
        if(l>=r){
            return arr;
        }
        int k = arr[l+r >> 1],i=l-1,j=r+1;
        while(i<j){
            while(arr[++i]<k);
            while(arr[--j]>k);
            if(i<j){
                int temp = arr[i];
                arr[i]=arr[j];
                arr[j]=temp;
            }
        }
        quickSort(arr,l,j);
        quickSort(arr,j+1,r);
​
        return arr;
    }
​
    //TODO: 至少默写3-5遍(当前写了1遍)
    public static void main(String[] args) {
        int[] arr01 = {0,1};
        int[] arr02 = {1,2};
        int[] arr03 = {45, 78, 12, 67, 34, 90, 23, 56, 10};
​
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] arr04 = new int[n];
        for(int i=0;i<n;i++) {
            int num = in.nextInt();
            arr04[i] = num;
        }
        int[] res = quickSort(arr04, 0, n-1);
        System.out.println(Arrays.toString(res));
    }

注意点:

  • 注意i和j的初始值为:int i=l-1,j=r+1

  • 分界点k=arr[l+r >> 1]; 右移一位相当于除以二,右移2位是除以4;

(二)归并排序(稳定的)

基本思想:分治、从整个数组的中间开始划分

时间复杂度:稳定的O(nlogn)

步骤:
  1. 确定分界点mid = l+r >> 1;

  2. 递归排序左边和右边

  3. 归并(把两个有序数组合并为一个有序数组)

模板:
java 复制代码
import java.util.*;

public class Main{

    public static void mergeSort(int[] arr,int l,int r){
        //1.递归终止条件
        if(r<=l)return;

        //2.划分
        int mid = l+r>>1;
        mergeSort(arr,l,mid);
        mergeSort(arr,mid+1,r);

        //3.归并
        int tem[] = new int[r-l+1];
        int k=0,i=l,j=mid+1;
        while(i<=mid && j<=r){
            if(arr[i]<arr[j]) tem[k++] = arr[i++];
            else tem[k++] = arr[j++];
        }

        while(i<=mid) tem[k++] = arr[i++];
        while(j<=r) tem[k++] = arr[j++];

        //将临时数组中已经排好序的数据放到原数组(这里重复利用了之前定义过的i和j)
        for(i=l,j=0;i<=r;i++,j++){
            arr[i]=tem[j];
        }


    }

    public static void main(String[] args){

        Scanner in = new Scanner(System.in);

        int n = in.nextInt();
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            int num = in.nextInt();
            arr[i] = num;
        }

        mergeSort(arr,0,n-1);

        for(int i=0; i<n;i++){
            System.out.print(arr[i]+" ");
        }

    }
}
相关推荐
一只乔哇噻7 分钟前
java后端工程师进修ing(研一版 || day41)
java·开发语言·学习·算法
愚润求学9 分钟前
【贪心算法】day7
c++·算法·leetcode·贪心算法
知识分享小能手21 分钟前
React学习教程,从入门到精通,React 使用属性(Props)创建组件语法知识点与案例详解(15)
前端·javascript·vue.js·学习·react.js·前端框架·vue
要开心吖ZSH35 分钟前
软件设计师备考-(十六)数据结构及算法应用(重要)
java·数据结构·算法·软考·软件设计师
逍遥德1 小时前
Java8 Comparator接口 和 List Steam 排序使用案例
java·spring boot·list·排序算法
带娃的IT创业者1 小时前
如何开发一个教育性质的多线程密码猜测演示器
网络·python·算法
Aczone282 小时前
硬件(六)arm指令
开发语言·汇编·arm开发·嵌入式硬件·算法
知识分享小能手7 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
luckys.one7 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
~|Bernard|8 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda