【算法篇】/*简单直观理解归并排序*/(JAVA语言实现)

简介: 【算法篇】/*简单直观理解归并排序*/(JAVA语言实现)

hello,大家好,我依旧是你们熟悉的槿凉。这几天跟C站的小伙伴们互动的那是一个热火朝天,然后我发的一个动态也是出现了热评,真的是非常感谢各路大佬给予我衷心的建议,有了大家的支持,对我自己的编程学习无疑是莫大的帮助哈!好了,废话不多说,今天我们就来说说这个归并排序算法!(先附上一张我的动态热评图叭 嘿嘿还是有点激动的)


定义:归并排序的基本思想是首先将a[0……n-1]看成n个长度为1的有序表,将相邻的k个有序子表成对归并,得到n/k个长度为k的有序子表,然后将这些有序子表继续归并,最后得到一个长度为n的有序表。

看完是不是有些懵啦! 好,没有关系,这里举个例子大家就看的比较清晰了。

b4d22f8c9cc0410b870bc6b9f68178b2.jpg

好了,这里了解到归并排序的用法我们来到程序中具体看一个例子:

这里我们定义一个数组arr[],里面有八个元素:

packageyinghang;
importjava.util.Arrays;
publicclassmargesort {
publicstaticvoidmain(String[] args) {
intarr[] = {1,2,3,4,5,6,7,8};

我们先设计一个合并的方法:(这里的temp数组相当于一个中转站,就是把排序好的数组元素放在里面 最后在赋值给原数组arr[])

//合并的方法publicstaticvoidmerge(intarr[],intleft,intmid ,intright,inttemp[]) {
inti=left;//初始化i,左边有序序列的初始序列intj=mid+1;//初始化j,右边有序序列的初始序列intt=0;//指向temp数组的当前序列

我们依次合并左右子表:

//先把左边有序序列的数据按照规则填充到temp数组//直到左右两边的有序序列,有一边处理完毕为止while(i<=mid&&j<=right) {
if(arr[i] <=arr[j]){
temp[t]=arr[i];
t++;
i++;
            }else{
temp[t] =arr[j];
t++;
j++;
            }

然后有的小伙伴就要问了,那如果数组里面的元素不是偶数的话,那多出来的元素怎么办?哎,这个问题问得好,那么我们继续还要设计一个方法来将剩余元素依次加到temp数组中:

//把有剩余数据的一边的数据依次全部填充到temp数组中while(i<=mid) {
temp[t] =arr[i];
t++;
i++;
        }
while(j<=right){
temp[t] =arr[j];
t++;
j++;
        }

那么接下来就是分+合的方法,就是依次排序好左右子表 然后放到temp数组中去:

//分+合的方法publicstaticvoidmergesort(intarr[],intleft,intright,inttemp[]) {
if(left<right) {
intmid= (left+right)/2;//中间索引mergesort(arr,left,mid,temp);//向左子表进行分解mergesort(arr,mid+1,right,temp);//右子表分解        }
    }

这里我们在主函数里进行我们的输出:

inttemp[] =newint[arr.length];//归并排序需要一个额外空间mergesort(arr,0,arr.length-1,temp);
System.out.println("归并排序后="+Arrays.toString(arr));

63f32bc67f4c4ea2b97c331fe77366f3.png

看的出来,我们的方法是正确的!那么我们最后给出最终的源代码:

importjava.util.Arrays;
publicclassmargesort {
publicstaticvoidmain(String[] args) {
intarr[] = {1,2,3,4,5,6,7,8};
inttemp[] =newint[arr.length];//归并排序需要一个额外空间mergesort(arr,0,arr.length-1,temp);
System.out.println("归并排序后="+Arrays.toString(arr));
    }
//分+合的方法publicstaticvoidmergesort(intarr[],intleft,intright,inttemp[]) {
if(left<right) {
intmid= (left+right)/2;//中间索引mergesort(arr,left,mid,temp);//向左子表进行分解mergesort(arr,mid+1,right,temp);//右子表分解        }
    }
//合并的方法publicstaticvoidmerge(intarr[],intleft,intmid ,intright,inttemp[]) {
inti=left;//初始化i,左边有序序列的初始序列intj=mid+1;//初始化j,右边有序序列的初始序列intt=0;//指向temp数组的当前序列//先把左边有序序列的数据按照规则填充到temp数组//直到左右两边的有序序列,有一边处理完毕为止while(i<=mid&&j<=right) {
if(arr[i] <=arr[j]){
temp[t]=arr[i];
t++;
i++;
            }else{
temp[t] =arr[j];
t++;
j++;
            }
        }//把有剩余数据的一边的数据依次全部填充到temp数组中while(i<=mid) {
temp[t] =arr[i];
t++;
i++;
        }
while(j<=right){
temp[t] =arr[j];
t++;
j++;
        }
    }
}


相关文章
|
29天前
|
数据采集 分布式计算 大数据
Java语言在大数据处理中的应用
传统的大数据处理往往依赖于庞大的数据中心和高性能的服务器,然而随着大数据时代的到来,Java作为一种强大的编程语言正在被广泛应用于大数据处理领域。本文将探讨Java语言在大数据处理中的优势和应用,以及其在分布式计算、数据处理和系统集成等方面的重要作用。
|
6天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
6天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
49 10
|
11天前
|
Java Android开发 C++
Kotlin vs Java:选择最佳语言进行安卓开发
【4月更文挑战第13天】Java曾是安卓开发的主流语言,但Kotlin的崛起改变了这一局面。Google在2017年支持Kotlin,引发两者优劣讨论。Java以其成熟稳定、强大生态和跨平台能力占优,但代码冗长、开发效率低和语言特性过时是短板。Kotlin则以简洁语法、空安全设计和高度兼容Java脱颖而出,但社区和生态系统仍在发展中,可能存在学习曲线和性能问题。选择语言应考虑项目需求、团队熟悉度、维护性、性能和生态系统。无论选择哪种,理解其差异并适应新技术至关重要。
|
15天前
|
存储 算法 搜索推荐
【数据结构与算法】归并排序(详解:递归与非递归的归并排序 | 赠:冒泡排序和选择排序)
【数据结构与算法】归并排序(详解:递归与非递归的归并排序 | 赠:冒泡排序和选择排序)
|
15天前
|
算法 安全 Java
java代码 实现AES_CMAC 算法测试
该代码实现了一个AES-CMAC算法的简单测试,使用Bouncy Castle作为安全提供者。静态变量K定义了固定密钥。`Aes_Cmac`函数接受密钥和消息,返回AES-CMAC生成的MAC值。在`main`方法中,程序对给定的消息进行AES-CMAC加密,然后模拟接收ECU的加密结果并进行比较。如果两者匹配,输出&quot;验证成功&quot;,否则输出&quot;验证失败&quot;。辅助方法包括将字节转为16进制字符串和将16进制字符串转为字节。
|
22天前
|
Java
Java语言打印九九乘法表(详解)
Java语言打印九九乘法表(详解)
15 1
Java语言打印九九乘法表(详解)
|
25天前
|
搜索推荐 算法
【数据结构】八大排序之归并排序算法
【数据结构】八大排序之归并排序算法
20 5
|
25天前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
33 0
|
30天前
|
Java API 开发工具
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(三)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
30 0