归并排序——Java代码实现

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

归并排序思想

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。
该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
* 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
* 自下而上的迭代;

一、划分 

  1. 当待排序数组 a[ ] 长度 a.length >= 3时,将数组 a [ ] 从 cennter = ( a.length + 1 ) / 2 划分为 left [ 0 ~ center-1 ] , right [ center ~ a.length - 1 ] 。
  2. 将划分后的数组 left [ ] 和 right [ ] 合并。 
  3. 若数组a [ ] 长度a.length < 3,对该数组直接排序。
  4. 最后将处理后的数组返回。

划分阶段——sort()函数进行

 二、合并

  1. 初始化合并后的数组为 merge[ ] ,长度为 left.length + right.length 。变量 i ,j,k 初始为0
  2. 对上一步划分的数组自底向上合并到merge [ ]。
  3. i 扫描 left [ ] , j 扫描 right [ ] , k 扫描 merge [ ] 。依次将 left [ i ] 和 right [ j ] 的较小者加入 merge [ k ]。
                if (left[i] < right[j]) {
                    merge[k++] = left[i++];
                } else {
                    merge[k++] = right[j++];
                }

  4. 当 i 或 j 扫描结束时,将剩下的一部分( left [ ] 或 right [ ] 中未全部被扫描的)加入 merge [ ] 。
            if (i == left.length) {
                while (j < right.length) {
                    merge[k++] = right[j++];
                }
            } else if (j == right.length) {
                while (i < left.length) {
                    merge[k++] = left[i++];
                }
            }
    合并阶段———merge()函数进行

 三、完整代码 

Gitee

import java.util.Arrays;

/**
 * @author: pikachu
 * @description: 归并排序
 * 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。
 * 该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
 * 作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
 * 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
 * 自下而上的迭代;
 * @date: 2022/7/29 21:21
 */
public class Merge {
    private static int count=1;
    /**
     * Desc:
     *
     * @param left  待合并数组左半部分
     * @param right 待合并数组右半部分
     * @return {@link int[]}    合并 left 和 right 后的有序数组
     * @author pikachu
     */
    private static int[] merge(int[] left, int[] right) {
        int[] merge = new int[left.length + right.length];
        int i = 0;
        int j = 0;
        int k = 0;
        while (i < left.length && j < right.length) {
            if (left[i] < right[j]) {
                merge[k++] = left[i++];
            } else {
                merge[k++] = right[j++];
            }
        }
        if (i == left.length) {
            while (j < right.length) {
                merge[k++] = right[j++];
            }
        } else if (j == right.length) {
            while (i < left.length) {
                merge[k++] = left[i++];
            }
        }
        return merge;
    }

    public static int[] sort(int[] a) {
        int center = (a.length + 1) / 2;
        if (center > 1) { //  数组长度>=3
            // 分
            int[] left = Arrays.copyOfRange(a, 0, center);  // 拷贝包首不包尾
            int[] right = Arrays.copyOfRange(a, center, a.length);
            left = sort(left);
            right = sort(right);
            // 治
            a = merge(left, right);
            System.out.println("第"+count+++"次合并:"+Arrays.toString(a));
        } else {    // 数组长度<3
            if (a[0] > a[a.length - 1]) {
                int temp = a[0];
                a[0] = a[a.length - 1];
                a[a.length - 1] = temp;
            }
        }
        return a;
    }
}

class Test16 {
    public static void main(String[] args) {
//                int[] arr = new int[]{4, 2, 8, 3, 6, 9, 1, 22, 8, 11};
        int[] arr = new int[]{7, 6, 1, 1, 7, 6, 8, 3, 5, 7};
//        int n = 10;
//        int[] arr = new int[n];
//        int[] arr1 = new int[n];
//        for (int i = 0; i < n; i++) {
//            arr[i] = (int) (Math.random() * n);
//            arr1[i] = (int) (Math.random() * n);
//        }

        System.out.println("归并排序前:" + Arrays.toString(arr));

        long start = System.currentTimeMillis();
        arr = Merge.sort(arr);
        long end = System.currentTimeMillis();
        System.out.println("归并排序后:" + Arrays.toString(arr));
        System.out.println("耗时:" + (end - start) + "毫秒");

//        long start1 = System.currentTimeMillis();
//        Quick quick = new Quick();
//        quick.sort(arr1, 0, arr1.length - 1);
//        long end1 = System.currentTimeMillis();
//        System.out.println("耗时:" + (end1 - start1) + "毫秒");

//        System.out.println("quick.sort()排序后:" + Arrays.toString(arr1));
    }
}

四、结果&&速度测试

结果测试
结果测试

归并排序与快速排序速度比较

Java实现合并排序算法 合并排序是一种经典的排序算法,其基本思想是将待排序的序列不断地划分成更小的子序列,直到每个子序列只有一个元素,然后不断地将这些有序的子序列合并,最终得到一个完全有序的序列。总结:本文介绍了Java语言实现合并排序算法的方法,并附上了相应的源代码。希望读者通过学习本文,能够理解合并排序算法的基本原理,并掌握使用Java语言实现算法的技巧。在上述代码中,我们首先定义了一个包含九个元素的整型数组,然后调用mergeSort方法对该数组进行排序,并通过printArray方法打印排序后的结果。 阅读详情

相关推荐

Java:实现归并排序算法(附完整源码)

Java:实现归并排序算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 418

JAVA实现归并排序

Java语言实现归并排序算法

QQ719271879的博客 2682

Java归并排序算法详解及代码实现

归并排序是一种经典的排序算法,它采用了分治的思想,将待排序的数组分成两个子数组,分别对子数组进行排序,然后再将排好序的子数组合并起来,从而得到完全有序的数组。在本文中,我们将详细介绍归并排序的原理,并给出Java语言的实现代码

EadDeveloper的博客 182

归并排序(Java代码实现)

将两个或两个以上的有序表合并成一个有序表的过程。常用的归并为2-路归并,就是将两个有序表合为一个有序表。可以看出,归并排序分为分解和合并两个步骤。分解就是将原数组分解成只有一个数的数组。合并就是将相邻两个数组进行排序合并。可适用于大多数情况的排序。

qq_54414566的博客 1757

归并排序Java代码实现

归并排序Java代码实现 1. 算法思想 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 2. 时间复杂度 最好时间复杂度很最坏时间复杂度都是O ( n log2 n ) 3. 代码实现 public class Mergee { public static void main(String[] args) {

m0_48372408的博客 2313

归并排序Java代码实现

归并排序归并排序采用的是分治(divide-and-conquer)法思想。(1)基本思想:将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。 (2)执行过程:(3)算法思路:(4)Java代码实现如下:public class Main { public static void main(String[] args) { ...

Leo的博客 5万+

Java 实现归并排序:深入剖析原理与代码

合并过程中,将两个已经排序好的子数组(通常是相邻的)合并成一个更大的排序好的子数组。具体操作是比较两个子数组的首元素,将较小的元素取出放入一个临时数组中,然后继续比较两个子数组的下一个元素,直到其中一个子数组的元素全部被放入临时数组。最后,将临时数组中的元素复制回原数组对应的位置,完成一次合并操作。在这篇博客中,我们将详细解析一段用 Java 实现归并排序代码,帮助大家深入理解归并排序的原理以及具体的实现细节。方法负责将两个已经拆分并可能已经排序好的子数组进行合并,使其成为一个更大的排序好的子数组。

qq_69304031的博客 1040

归并排序Java代码实现

import java.util.Arrays; public class MyMergeSort { public static void mergeSort(int[] nums, int low,int high){ if(low < high){ int mid = low + (high - low) / 2; mergeSort(nums, low, mid); mergeSort(nums.

我的梦境传说 177

Java代码实现归并排序

Java代码实现归并排序 归并排序(Merge Sort) 思路:如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。 所以说归并排序的核心思想是排序和合并两个有序数组,这个规程需要用递归来实现。 核心思想: 将数组拆分为两个数组,然后对两个数组各自进行排序。 合并两个排好序的数组。 需要注意的是,对子数组进行排...

tinyVampire的博客 2154

归并排序Java代码实现

一,概念 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。 二,实现步骤 (一)...

ClownModel的博客 268

JAVA合并排序(归并排序)代码-实现

Java合并排序(归并排序)代码-实现

飛之宇 1760

归并排序java代码实现

aa package com.demo.thinking; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class MergeSort { public static void main(String[] args) { List<Integer> integers = Arrays.asList(2, 3, 5, 8, 4, 11, 1, 7

ice-wee的专栏 362

归并排序java代码_归并排序的原理及java代码实现

概述归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序采用的是递归来实现,属于“分而治之”,将目标数组从中间一分为二,之后分别对这两个数组进行排序,排序完毕之后再将排好序的两个数组“归并”到一起,归并排序最重要的也就是这个“归并”的过程,归并的过程中需要额外的跟需要归并的两个数...

weixin_39753213的博客 181

归并排序(Merging Sort)学习和Java代码实现

1.归并排序 “归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。 归并排序的基本思路: (1)假设初始序列有n个记录,则可以看成n个有序的子序列,每个子序列的长度为1。 (2)然后两两归并,得到[n/2]个长度为2或1(n为奇数的情况)的有序子序列; (3)两个有序子序列不断归并,重复上一步... (4)最终得到一个长度为n的子序列。 举一个归并的例子,相同颜色的值为一...

学习笔记 450

JAVA代码实现归并排序

归并排序 归并排序用到了分治法的思想。用代码实现时,按从小到大排序为例,主要的思路分为分解和合并两大步骤: 分解: 第一次分解时,根据数组的头尾下标,得出分界线的位置,即:mid=(left+right)/2; 向左递归分解:就是将数组的头下标和分界线的下标当做新序列的头尾下标再次分解; 向右递归分解:就是将分界线的下标后一位(mid+1)和数组的尾下标当做新序列的头尾下标再次分解; 分解结束后...

qq_41665523的博客 223

java实现归并排序代码

public class MergeSort { public static void merge(int[] a, int start, int mid, int end) { int[] tmp = new int[a.length]; System.out.println("merge " + start + "~" + end); int i = start, j = mid + 1, k = start; while (i != mid + 1 &a

qq_40181114的博客 232

归并排序算法代码java(递归实现)【亲测】

归并排序 public class Sort { /** *归并排序(递归实现) */ void mergeSort(int []arr,int len){ if (len&gt;1){ //数组中元素个数大于1时执行 //1.将数组分组 int half=l...

天地一蜉蝣 619

java实现归并排序(详细解释代码和逻辑)

归并排序(Merge Sort)是一种基于分治法的排序算法。它将数组分成两个子数组,分别进行排序,然后合并这两个有序的子数组。其时间复杂度为O(n log n),空间复杂度为O(n)。下面是用Java实现归并排序代码以及详细的注释和两个代码例子。

weixin_42487883的博客 607
上一篇: 回溯递归——八皇后问题
下一篇: 哈夫曼树、编码构造,实现文件压缩(Java)
pikachu_plus
博客等级 码龄5年 0粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值