归并算法

MergeSort归并排序就是将一组数分割成两个子数组,再对子数组进行排序,然后再归并起来。

在这个过程中,通过递归的方式对子数组进行归并排序。

过程(Wikipedia):

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4. 重复步骤3直到某一指针到达序列尾
  5. 将另一序列剩下的所有元素直接复制到合并序列尾

代码实现(java):

  1. import java.util.Arrays;  
  2.   
  3.   
  4. public class MergeSort {  
  5.     public static void mergeSort(int [] array){  
  6.            
  7.         int middle=array.length/2;//中间标  
  8.            
  9.         if(array.length>1){  
  10.            
  11.         int[]left=Arrays.copyOfRange(array,0,middle);//拷贝数组array的左半部分  
  12.         int[]right=Arrays.copyOfRange(array,middle,array.length);//拷贝数组array的右半部分  
  13.         mergeSort(left);//对左边数组递归  
  14.         mergeSort(right);//对右边数组递归  
  15.         merge(array,left,right);//数组左、右合并到Array  
  16.            
  17.          for (int j = 0; j < array.length; j++) {  
  18.              System.out.print(array[j]);  
  19.              System.out.print(",");  
  20.          }  
  21.          System.out.println();  
  22.         }  
  23.         }  
  24.            
  25.         //合并数组,升序  
  26.         private static void merge(int[]result,int[]left,int[]right){  
  27.            
  28.         int i=0,l=0,r=0;  
  29.            
  30.         while(l<left.length&&r<right.length){  
  31.            
  32.         if(left[l]<right[r]){  
  33.         result[i]=left[l];  
  34.         i++;  
  35.         l++;  
  36.         }else{  
  37.         result[i]=right[r];  
  38.         i++;  
  39.         r++;  
  40.         }  
  41.         }  
  42.         //如果右边剩下合并右边的  
  43.         while(r<right.length){  
  44.         result[i]=right[r];  
  45.         r++;  
  46.         i++;  
  47.         }  
  48.         //如果左边剩下合并左边的  
  49.         while(l<left.length){  
  50.         result[i]=left[l];  
  51.         l++;  
  52.         i++;  
  53.         }  
  54.         }  
  55.   
  56.         public static void main(String[] args) {  
  57.             int[] arr = { 5556239047940827633 };  
  58.             for (int i = 0; i < arr.length; i++) {  
  59.                 System.out.print(arr[i]);  
  60.                 System.out.print(",");  
  61.             }  
  62.             System.out.println();  
  63.             mergeSort(arr);  
  64.         }  
  65. }  
运行结果:

55,56,23,90,47,9,40,82,76,33,
55,56,
47,90,
23,47,90,
23,47,55,56,90,
9,40,
33,76,
33,76,82,
9,33,40,76,82,
9,23,33,40,47,55,56,76,82,90,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值