首页 > 编程语言 >归并排序(Java)

归并排序(Java)

时间:2024-10-17 18:18:46浏览次数:12  
标签:归并 right Java arr int mid 排序 left

思想:

基本思想是使用递归将数组不断分成两半,直到分成的小组都只剩下一个元素为止,随后分别开始排序,将排序好的数组合并在一起。

归并排序使用了分治(Divide and Conquer)的思想。包括以下三个步骤:

  1. 划分(Divide):将原问题分解成几个规模较小的相同问题。
  2. 解决(Conquer):递归求解这些子问题。
  3. 合并(Combine):将子问题的解合并为原问题的解。

合并过程:

时间复杂度

归并排序的时间复杂度是 O(n log n),因为分解过程将数组分成 log n 层,合并过程每层需要 O(n) 的时间复杂度。

空间复杂度

归并排序的空间复杂度是 O(n),因为需要额外的空间来存储合并的临时数组。

归并排序是一种稳定的排序算法,因为合并操作不会改变相同元素的相对顺序。然而,它需要额外的内存空间,这在内存资源有限的情况下可能是一个缺点。

代码实现:

public class MergeSort {
    public static void main(String[] args) {
        //创建要排序的数组
        int nums[] = {9,7,18,8,2,5,16,10,12,6};
        divideSort(nums, 0, nums.length - 1);
        System.out.println(Arrays.toString(nums));
    }

    //递归数组
    public static void divideSort(int[] arr, int left, int right){
        if(left < right){
            int mid = (left + right) >>> 1;
            divideSort(arr,left,mid);
            divideSort(arr,mid+1,right);
            MergeSort(arr,left,mid,right);
        }
    }

    //排序
    public static void MergeSort(int[] arr, int left, int mid, int right){
        //合并数组
        int i = left;
        int j = mid + 1;
        int k = 0;
        int[] temp = new int[right - left + 1];
        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 (i = left, k = 0; i <= right; i++, k++) {
            arr[i] = temp[k];
        }
    }
}

运行结果:

标签:归并,right,Java,arr,int,mid,排序,left
From: https://blog.csdn.net/weixin_73792626/article/details/142508517

相关文章

  • Topk问题与堆排序(Java数据结构)
    前言:    接触完堆之后,也逐渐对堆了如指掌,最后再来讨论一下两个问题。    有如下场景:    1、全国有几千所大学,我如何能够快速找出排名前10的大学?    2、我如何对这10所大学排好序?    为了用堆解决问题,接下来我们就来一起学习Top......
  • Java数据结构二叉树面试题精华(画图详解)
    前言:    针对二叉树,因为涉及到递归,需要跟多的练习强化递归的思想,其中也包括需要画图理解一些想不通的问题来提升自己!    一下面这些题为例,一起来提升自己的逻辑思维能力!(可能其中一些题已经写过,但是希望能再写一遍有助于提高代码能力)相同的树:      ......
  • [1437]基于JAVA的志愿者服务智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的志愿者服务智慧管理系统的设计与实现指导老师(一)选题的背景和意义选题背景与意义:随着我国社会文明程度的不断提升,志愿服务已成为社会进步、社区建设与发展的重要力量。志愿者服务智慧管理系统作为一种信息化工具,......
  • Java的Stream流编程的排序sorted方法里参数o1,o2分别代表什么?
    先说结论:在sorted方法中,o1是最后面的元素,o2是倒数第二个元素,以此类推,流是处理元素是从后面开始取值。  packagecom.br.itwzhangzx02.learn;     importorg.junit.Test;   importjava.util.ArrayList; importjava.util.List;......