归并排序算法

简介: 归并排序算法

文章目录

  1. 算法思想
  2. 算法图解
  3. 代码实现
  4. 算法特点
  1. 算法思想

 主要思想:

  1. 算法图解

int[] array = {30,60,40,10,80,20,50,70};
以数组array为例降序分析

先将数组分为左右子表 

 将左右子表继续拆分,知道只有两个元素时,开始比较并排序

 接下来将有序的子表进行合并,产生一个新的数组用来存放排序结果

  1. 代码实现

代码:

import java.util.Arrays;

public class MergeSort {

public int[] sortArray(int[] nums){
    if(nums.length<2){
        return nums; 
    }
    //切分数组,然后递归排序 ,并用merge合并
    int mid = nums.length/2;
    int[] left = Arrays.copyOfRange(nums,0,mid);
    int[] right = Arrays.copyOfRange(nums,mid,nums.length);
    return merge(sortArray(left),sortArray(right));
}

public static int[] merge(int[] left,int[] right){
    int[] result = new int[left.length+ right.length];
    for (int index = 0,i=0,j=0;index < result.length;index++){
        if(i>= left.length){
            result[index] = right[j++];
        } else if (j >= right.length){
            result[index] = left[i++];
        } else if (left[i]>right[j]) {
            result[index] = right[j++];
        } else {
            result[index] = left[i++];
        }
    }
    System.out.println("左子数组:");
    PrintArray.print(left);
    System.out.println("右子数组:");
    PrintArray.print(right);
    System.out.println("合并后的数组");
    PrintArray.print(result);
    System.out.println("-----------");
    return result;
}

public static void main(String[] args) {
    int[] nums = {32,12,1,12,23,45,11,100,55,76,34};

    int[] array = new MergeSort().sortArray(nums);
}

}
class PrintArray{

public static void print(int[] nums){
    System.out.println(Arrays.toString(nums));
}

}
结果:

  1. 算法特点

时间复杂度:
每次将序列折半分组,共需要logn轮,因此归并排序算法的时间复杂度是O(nlogn)

空间复杂度:
排序过程中需要额外的一个序列去存储排序后的结果,所占空间是n,因此空间复杂度为O(n)

稳定性:
在排序过程中,相同元素的前后顺序并没有改变,是一种稳定排序算法

相关文章
|
2月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
27 1
|
2月前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
2月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
76 0
|
2月前
|
搜索推荐 Java Go
深入了解归并排序算法
深入了解归并排序算法
25 0
|
4月前
|
算法 搜索推荐 Java
算法实战:手写归并排序,让复杂排序变简单!
归并排序是一种基于“分治法”的经典算法,通过递归分割和合并数组,实现O(n log n)的高效排序。本文将通过Java手写代码,详细讲解归并排序的原理及实现,帮助你快速掌握这一实用算法。
45 0
|
4月前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
46 0
|
5月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
【7月更文挑战第12天】归并排序是高效稳定的排序算法,采用分治策略。Python 实现包括递归地分割数组及合并已排序部分。示例代码展示了如何将 `[12, 11, 13, 5, 6]` 分割并归并成有序数组 `[5, 6, 11, 12, 13]`。虽然 $O(n log n)$ 时间复杂度优秀,但需额外空间,适合大规模数据排序。对于小规模数据,可考虑其他算法。**
80 4
|
5月前
|
算法 搜索推荐 C#
|
6月前
|
搜索推荐 C语言
【C/排序算法】:快速排序和归并排序的非递归实现
【C/排序算法】:快速排序和归并排序的非递归实现
42 0
|
6月前
|
搜索推荐 算法
【C/排序算法】:归并排序和计数排序
【C/排序算法】:归并排序和计数排序
42 0