认识O(NlogN)的排序

参考视频:一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵) 点击观看

文章目录


中点

int mid = (L + R) / 2;
int mid = L + (R - L) / 2;(防止溢出)
int mid = L + ((R - L) >> 1);

复制代码
>> 1 相当于除以2,但位运算比算术运算更快
注意括号必须加,因为移位运算符优先级低于加法

使用递归方法求一个数组L到R的最大值

java 复制代码
public class Main {
    public static void main(String[] args) {
        //使用递归方法求数组中L到R的最大值
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        System.out.println(getMax(arr, 0, arr.length - 1));
    }
    public static int getMax(int[] arr, int L, int R) {
        if (L == R) {
            return arr[L];
        }
        int mid = L + ((R - L) >> 1);
        int leftMax = getMax(arr, L, mid);
        int rightMax = getMax(arr, mid + 1, R);
        return Math.max(leftMax, rightMax);
    }
}

归并排序

java 复制代码
public class Main {
    public static void main(String[] args) {
        //归并排序
        int[] arr = {8, 4, 5, 7, 1, 3, 6, 2};
        mergeSort(arr, 0, arr.length - 1);
    }
    public static void mergeSort(int[] arr, int left, int right) {
        int mid = (left + right) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }
    public static void merge(int[] arr, int left, int mid, int right) {
        int[] temp = new int[right - left + 1];
        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++];
        }
        for (int m = 0; m < k; m++) {
            arr[left + m] = temp[m];
        }
        System.out.println("归并:");
        for (int n = left; n <= right; n++) {
            System.out.print(arr[n] + " ");
        }
    }
}
java 复制代码
public class Main {
    public static void main(String[] args) {
        //归并排序求解小和问题
        int[] arr = {8, 4, 5, 7, 1, 3, 6, 2};
        int sum = mergeSort(arr, 0, arr.length - 1);
        System.out.println(sum);
    }
    public static int mergeSort(int[] arr, int left, int right) {
        if (left == right) {
            return 0;
        }
        int mid = (left + right) / 2;
        return mergeSort(arr, left, mid)+
        mergeSort(arr, mid + 1, right)+
        merge(arr, left, mid, right);
    }
    public static int merge(int[] arr, int left, int mid, int right) {
        int[] temp = new int[right - left + 1];
        int i = left, j = mid + 1, k = 0;
        int res = 0;
        while (i <= mid && j <= right) {
            res+=arr[i] < arr[j] ? arr[i] * (right - j + 1) : 0;
            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++];
        }
        for (int m = 0; m < k; m++) {
            arr[left + m] = temp[m];
        }
        System.out.println("归并:");
        for (int n = left; n <= right; n++) {
            System.out.print(arr[n] + " ");
        }
        System.out.println();
        return res;
    }
    //8, 4, 5, 7, 1, 3, 6, 2
    //4+9+1+13+1=28
}

快速排序

例子

情况1:左边是小于等于num的数右边是大于num的数

情况2:左边是小于num的数中间是等于num的数右边是大于num的数

相关推荐
咩咩啃树皮10 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
灯澜忆梦10 小时前
GO_并发编程---定时器
开发语言·后端·golang
鱟鲥鳚11 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
-银雾鸢尾-11 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-11 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白12 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司13 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地14 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415914 小时前
TCP超时重传机制是为了解决什么问题?
java
段一凡-华北理工大学14 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化