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

归并排序(Java)

时间:2024-10-17 18:18:46浏览次数:10  
标签:归并 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

相关文章

  • LeetCode:809.情感丰富的文字(双指针 Java)
    目录809.情感丰富的文字题目描述:实现代码与解析:双指针原理思路:809.情感丰富的文字题目描述:        有时候人们会用重复写一些字母来表示额外的感受,比如 "hello"->"heeellooo", "hi"->"hiii"。我们将相邻字母都相同的一串字符定义为相同字母组,例如:"h",......
  • Java基于微信小程序的大学生兼职管理系统,附源码+文档
    博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • Java多线程编程:深入理解与实践
    java笔记,点击下载在现代软件开发中,多线程编程已成为提高程序性能和响应能力的关键技术之一。Java作为一门高级编程语言,提供了丰富的多线程支持,使得开发者能够轻松地编写并发程序。本文将深入探讨Java多线程的基本概念、实现方式以及最佳实践。多线程的基本概念多线程是指......
  • Topk问题与堆排序(Java数据结构)
    前言:    接触完堆之后,也逐渐对堆了如指掌,最后再来讨论一下两个问题。    有如下场景:    1、全国有几千所大学,我如何能够快速找出排名前10的大学?    2、我如何对这10所大学排好序?    为了用堆解决问题,接下来我们就来一起学习Top......
  • Java数据结构二叉树面试题精华(画图详解)
    前言:    针对二叉树,因为涉及到递归,需要跟多的练习强化递归的思想,其中也包括需要画图理解一些想不通的问题来提升自己!    一下面这些题为例,一起来提升自己的逻辑思维能力!(可能其中一些题已经写过,但是希望能再写一遍有助于提高代码能力)相同的树:      ......
  • 一个月学会Java 第20天 多线程
    Day20多线程线程,很重要的概念,因为我们的CPU假如是intel或者amd的都是说一核二线程,假如你的电脑是8核的cpu那基本上就是16线程,如果你的mac的M芯片自然是几核就是几线程。想要查看自己的电脑是几个线程的我们有几种方法,一种直接使用Java运行一串代码,其次我们可以看任务管......
  • 【2024华为OD-E卷-100分-内存资源分配】(题目+思路+Java&C++&Python解析+在线测试)
    在线评测链接题目描述有一个简易内存池,内存按照大小粒度分类,每个粒度有若干个可用内存资源,用户会进行一系列内存申请,需要按需分配内存池中的资源返回申请结果成功失败列表。分配规则如下:分配的内存要大于等于内存的申请量,存在满足需求的内存就必须分配,优先分配粒度小的......
  • [1426]基于JAVA的微信公众号运营智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于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;......