【好记性不如烂笔头】分冶算法之归并排序

简介: 归并排序原理,先上图,如果是奇数个数据,我自己画的图,右图   代码奉上: 1 package com.servlet; 2 3 public class MyMergeSort { 4 public static void main(String[] args...

归并排序原理,先上图,如果是奇数个数据,我自己画的图,右图

 

代码奉上:

 1 package com.servlet;
 2 
 3 public class MyMergeSort {
 4     public static void main(String[] args) {
 5         int[] array={2,4,7,5,8,1,3,6};
 6         printArray(array);
 7         
 8         devide(array,0,array.length-1);
 9         
10         System.out.println("排序后:");
11         printArray(array);
12     }
13     /*分解数据*/
14     public static void devide(int[] array,int left,int right){
15         
16         if(left<right){
17             /*寻找到中间下标*/
18             int mid=(right+left)/2;
19             /*从中间下标隔断,将前后两段分别分解*/
20             devide(array,left,mid);
21             /*继续分割第二段*/
22             devide(array,mid+1,right);
23             /*分割完了,调用归并*/
24             merge(array,left,mid,mid+1,right);    
25         }
26     }
27     /*归并,包含排序*/
28     public static void merge(int[] array,int leftStart,int leftEnd,int rightStart,int rightEnd){
29         /*新建临时数组,存放该次归并后的数据*/
30         int[] temp=new int[array.length];
31         /*记录归并的左组和右组开始结束下标*/
32         int ls=leftStart,le=leftEnd,
33             rs=rightStart,re=rightEnd;
34         /*记录临时数组的存放位置*/
35         int index=ls;
36         /*第一次比较归并,左组合右组中较小的入temp*/
37         while(ls<=le&&rs<=re){
38             if(array[ls]<=array[rs]){
39                 temp[index]=array[ls];
40                 index++;ls++;
41             }else{
42                 temp[index]=array[rs];
43                 index++;rs++;
44             }    
45         }
46         /*第二次选择归并,将array中剩余的未加入temp的数加入到temp中*/
47         while(ls<=le){
48             temp[index]=array[ls];
49             ls++;index++;
50         }
51         while(rs<=re){
52             temp[index]=array[rs];
53             rs++;index++;
54         }
55         /*temp是经过调整后的array,此时一次归并完毕,返回数据进行下一次归并*/
56         while(leftStart<=rightEnd){
57             array[leftStart]=temp[leftStart];
58             leftStart+=1;
59         }
60         /*打印本次归并结果*/
61         printArray(array);
62     }
63     public static void printArray(int[] array){
64         for(int i=0;i<array.length;i++)
65             System.out.print(array[i]+"  ");
66         System.out.println();
67     }
68     
69     
70 }

 排序结果:

 

 另外奉上各种排序图示的小视频一只……

 

黑夜给了我黑色的眼睛,我却用它寻找光明
目录
相关文章
|
6月前
|
机器学习/深度学习 算法 搜索推荐
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
|
2月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
27 1
|
2月前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
2月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
76 0
|
2月前
|
搜索推荐 Java Go
深入了解归并排序算法
深入了解归并排序算法
24 0
|
7月前
|
算法 前端开发 搜索推荐
前端算法之归并排序
前端算法之归并排序
39 0
|
4月前
|
算法 搜索推荐 Java
算法实战:手写归并排序,让复杂排序变简单!
归并排序是一种基于“分治法”的经典算法,通过递归分割和合并数组,实现O(n log n)的高效排序。本文将通过Java手写代码,详细讲解归并排序的原理及实现,帮助你快速掌握这一实用算法。
44 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#