排序算法之【归并排序】

目录

实现归并排序【MergeSort】并提供升序和降序方法

归并排序方法测试

LeetCode-215题


实现归并排序【MergeSort】并提供升序和降序方法

java 复制代码
/**
 * 归并排序
 */
public class MergeSort {

    // 升序排列
    private static final int UP_SORT_TYPE = 1;

    // 降序排列
    private static final int DOWN_SORT_TYPE = -1;

    /**
     * 升序排列
     *
     * @param nums:要排序的数组
     */
    public static void upSort(int[] nums) {
        if (nums == null || nums.length < 2)
            return;
        split(nums, 0, nums.length - 1, UP_SORT_TYPE);
    }

    /**
     * 降序排列
     *
     * @param nums:要排序的数组
     */
    public static void downSort(int[] nums) {
        if (nums == null || nums.length < 2)
            return;
        split(nums, 0, nums.length - 1, DOWN_SORT_TYPE);
    }

    /**
     * 分-治-合思想的体现
     */
    private static void split(int[] nums, int low, int high, int sortType) {
        if (low == high)
            return;
        int mid = (low + high) >>> 1;
        split(nums, low, mid, sortType);
        split(nums, mid + 1, high, sortType);
        merge(nums, low, mid, high, sortType);
    }

    private static void merge(int[] nums, int low, int mid, int high, int sortType) {
        int[] help = new int[high - low + 1];
        int i = 0;
        // 双指针
        int p1 = low;
        int p2 = mid + 1;

        while (p1 <= mid && p2 <= high) {
            if (sortType == UP_SORT_TYPE) {
                // 处理成升序排列
                help[i++] = nums[p1] < nums[p2] ? nums[p1++] : nums[p2++];
            } else {
                // 处理成降序排列
                help[i++] = nums[p1] > nums[p2] ? nums[p1++] : nums[p2++];
            }
        }

        while (p1 <= mid)
            help[i++] = nums[p1++];

        while (p2 <= high)
            help[i++] = nums[p2++];

        for (i = 0; i < help.length; i++) {
            nums[low + i] = help[i];
        }
    }
}

归并排序方法测试

java 复制代码
import java.util.Arrays;

public class MergeSortTest {
    public static void main(String[] args) {
        // 测试升序
        int[] nums1 = {23, 12, 34, 42, 345, 56, 45, 34, 37, 43, 1, 23, 44, 67};
        MergeSort.upSort(nums1);
        // [1, 12, 23, 23, 34, 34, 37, 42, 43, 44, 45, 56, 67, 345]
        System.out.println(Arrays.toString(nums1));

        // 测试降序
        int[] nums2 = {23, 12, 34, 42, 345, 56, 45, 34, 37, 43, 1, 23, 44, 67};
        MergeSort.downSort(nums2);
        // [345, 67, 56, 45, 44, 43, 42, 37, 34, 34, 23, 23, 12, 1]
        System.out.println(Arrays.toString(nums2));
    }
}

LeetCode-215题

求数组中的第K个最大元素,这里使用归并排序方式

java 复制代码
class Solution {
    public int findKthLargest(int[] nums, int k) {
        MergeSort.downSort(nums);
        return nums[k - 1];
    }

    /**
     * 归并排序
     */
    class MergeSort {

        // 升序排列
        private static final int UP_SORT_TYPE = 1;

        // 降序排列
        private static final int DOWN_SORT_TYPE = -1;

        /**
         * 升序排列
         *
         * @param nums:要排序的数组
         */
        public static void upSort(int[] nums) {
            if (nums == null || nums.length < 2)
                return;
            split(nums, 0, nums.length - 1, UP_SORT_TYPE);
        }

        /**
         * 降序排列
         *
         * @param nums:要排序的数组
         */
        public static void downSort(int[] nums) {
            if (nums == null || nums.length < 2)
                return;
            split(nums, 0, nums.length - 1, DOWN_SORT_TYPE);
        }

        /**
         * 分-治-合思想的体现
         */
        private static void split(int[] nums, int low, int high, int sortType) {
            if (low == high)
                return;
            int mid = (low + high) >>> 1;
            split(nums, low, mid, sortType);
            split(nums, mid + 1, high, sortType);
            merge(nums, low, mid, high, sortType);
        }

        private static void merge(int[] nums, int low, int mid, int high, int sortType) {
            int[] help = new int[high - low + 1];
            int i = 0;
            // 双指针
            int p1 = low;
            int p2 = mid + 1;

            while (p1 <= mid && p2 <= high) {
                if (sortType == UP_SORT_TYPE) {
                    // 处理成升序排列
                    help[i++] = nums[p1] < nums[p2] ? nums[p1++] : nums[p2++];
                } else {
                    // 处理成降序排列
                    help[i++] = nums[p1] > nums[p2] ? nums[p1++] : nums[p2++];
                }
            }

            while (p1 <= mid)
                help[i++] = nums[p1++];

            while (p2 <= high)
                help[i++] = nums[p2++];

            for (i = 0; i < help.length; i++) {
                nums[low + i] = help[i];
            }
        }
    }
}
相关推荐
karshey1 分钟前
【前端】Defer:存储Promise状态,多个异步事件都结束后处理一些逻辑
java·前端·javascript
Xinstall渠道统计平台2 分钟前
如何利用APP渠道统计提升营销效果
java·git·github
帅得不敢出门5 分钟前
Android Framework不弹窗设置默认sim卡
android·java·framework
是一个Bug8 分钟前
Java基础 -> JVM -> 并发 -> 框架 -> 分布式
java·jvm·分布式
a努力。8 分钟前
小红书Java面试被问:如何设计一个分布式ID生成器
java·后端·面试
czlczl2002092510 分钟前
Spring Security 进阶:基于 Customizer 的分布式权限配置架构设计
java·spring boot·分布式·后端·spring
lkbhua莱克瓦2410 分钟前
面向编程3-UDP通信程序
java·网络·网络协议·udp
shepherd12612 分钟前
从入门到实践:玩转分布式链路追踪利器SkyWalking
java·分布式·后端·skywalking
Seven9713 分钟前
剑指offer-54、字符流中第一个不重复的字符
java
武子康20 分钟前
Java-209 Spring AMQP 整合 RabbitMQ 实战:XML 配置直连交换机、RabbitAdmin 自动声明与收发闭环
xml·java·spring·rabbitmq·java-rabbitmq·java-activemq