首页 > 编程语言 >【排序算法】归并排序

【排序算法】归并排序

时间:2023-03-14 22:48:05浏览次数:33  
标签:归并 middle int res arr start 算法 排序

1  前言

今天把排序的几个算法过一下,这节我们看一下归并排序,简单的来说就是先拆再合,跟快排相反(快排时先找位置再两边拆),我们看示例。

2  代码示例

/**
 * 归并排序
 * 特点就是 跟快排相反,快排是先找再拆分,归并是先拆再合
 * 折半拆,指导拆分单个以后开始向上汇集
 */
public static void mergeSort(int[] arr, int[] res, int start, int end) {
    // 递归的出口,元素只有一个的时候直接返回
    if (start >= end) {
        return;
    }
    // 计算中间索引位置
    int middle = start + (end - start) / 2;
    // 拆分成两半,左边就是 0 ~ middle 右边就是 middle+1 ~ end
    int rightStart = middle + 1;
    // 左侧进行递归
    mergeSort(arr, res, start, middle);
    // 右侧进行递归
    mergeSort(arr, res,rightStart, end);
    // 开始汇集结果
    // 左侧索引变量
    int leftIndex = start;
    // 右侧索引变量
    int rightIndex = rightStart;
    // 结果的索引变量
    int index = start;
    // 左右两侧的数据都未汇集结束时
    while (leftIndex <= middle && rightIndex <= end) {
        // 升序,当左侧的值小于右侧的话,收集左侧的并将索引++
        if (arr[leftIndex] < arr[rightIndex]) {
            res[index++] = arr[leftIndex++];
            continue;
        }
        // 右侧的值小于左侧的,收集右侧的并将索引++
        res[index++] = arr[rightIndex++];
    }
    // 左侧的未处理干净时,收集剩余的
    while (leftIndex <= middle) {
        res[index++] = arr[leftIndex++];
    }
    // 右侧的未处理干净时,收集剩余的
    while (rightIndex <= end) {
        res[index++] = arr[rightIndex++];
    }
    /**
     * 这个是将排序后的顺序进行回写
     * 为什么要回写呢?因为后一次的结果汇集依赖前一次的结果
     *
     * 为什么要多个参数 res?
     * 这个我们在中间做拆分进行部分结果排序的时候不能直接在源数组上变更,所以需要个数据来存放排完序后覆盖回去
     */
    for (int i=start; i <= end; i++) {
        arr[i] = res[i];
    }
}
public static void main(String[] args) {
    int[] arr = IntStream.generate(() -> ThreadLocalRandom.current().nextInt(10000)).limit(10000).toArray();
    System.out.println("排序前:" + Arrays.stream(arr).mapToObj(String::valueOf).collect(Collectors.joining(",")));
    int[] res = new int[arr.length];
    mergeSort(arr, res, 0, arr.length - 1);
    System.out.println("排序后:" + Arrays.stream(arr).mapToObj(String::valueOf).collect(Collectors.joining(",")));
}

3  小结

有写的不对的地方,欢迎指正哈。

标签:归并,middle,int,res,arr,start,算法,排序
From: https://www.cnblogs.com/kukuxjx/p/17216717.html

相关文章

  • 快速排序
    原理取一个元素,使其归位(归位函数),归位后分为左边,右边,并且得到归位元素的位置归位元素位置的左右两边列表分别执行递归操作代码defpartion(lst,left,right): tmp=......
  • 回溯算法解决排列—组合—子集问题
    回溯算法解决排列—组合—子集问题无论是排列、组合还是子集问题,就是让你从序列nums中以给定规则取若干元素,主要有以下几种变体:元素无重不可复选,即nums中的元素都......
  • 二分图匹配(匈牙利算法和KM算法)
    二分图匹配对于一个二分图,其匹配是一个边的集合,每条边不应用重复的点它有一个匹配,为图中红色线段但这个匹配不是(边数)最大的,因此不是最大匹配匈牙利算法匈牙利算法......
  • 多源最短路算法——Floyd算法(转载)
    1.多源最短路简介:我们知道单源最短路是指从某一个源点到图中的其它顶点的最短路。多源最短路就是指每一个点到图中其他顶点的最短路。那么有的人肯定想我知道求单源最短路......
  • Qt 算法->程序运行时间(计时函数)
    参考:Qt算法->程序运行时间(计时函数)_qtclock函数_男银的骄傲的博客-CSDN博客 用的这个博客里的方法 QT笔记(7)——Qt利用QTime计算程序运行时间_abcvincent的博客-CSDN......
  • 【排序算法】希尔排序
    1 前言今天把排序的几个算法过一下,这节我们看一下希尔排序,简单的来说就是多次插入排序,我们看示例。2 代码示例/***希尔排序,也就是多次插入排序*可以参考插入......
  • 【排序算法】插入排序
    1 前言今天把排序的几个算法过一下,这节我们看一下插入排序,简单的来说就是从第2个元素往前寻找位置进行插入,我们看示例。2 代码示例/***插入排序*从第2个元素......
  • 【排序算法】直接选择排序
    1 前言今天把排序的几个算法过一下,这节我们看一下直接选择排序,简单的来说就是默认某个位置为最小然后从位置后的元素逐个比较进行交换,我们看示例。2 代码示例/**......
  • 算法-练习2
    题1给你两个 非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表......
  • 笔试算法《字符串排序_1》
    题目描述编写一个程序,将输入字符串中的字符按如下规则排序。规则1:英文字母从A到Z排列,不区分大小写。如,输入:Type输出:epTy规则2:同一个英文字母的大小写同时存在时,......