利用java怎么实现一个归并排序算法

  介绍

本篇文章给大家分享的是有关利用java怎么实现一个归并排序算法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

,归并排序算法,顾名思义,是一种先分再合的算法,其算法思想是将要排序的数组分解为单个的元素,每个元素就是一个单个的个体,然后将相邻的两个元素进行从小到大或从大到小的顺序排序组成一个整体,每个整体包含一到两个元素,然后对相邻的整体继续并“合”,因为每个整体都是排过序的,因而可以采用一定的算法对其进行合并,合并之后每个整体包含三到四个元素,继续对相邻的整体进行合并,直到所有的整体都合并为一个整体,最终得到的整体就是将原数组进行排序之后的结果。

,,,,,,对于相邻的整体,其合并的思想是每次都取两个整体(假设其实按升序排序的)中最小的元素放到一个新数组中,依次循环,最终两个整体中的元素都被取完即可得到一个按升序排序的整体。该合并过程就像有两个升序排序的牌堆A和B(如图所示),每次从最顶上取出一个元素放到牌堆C中:

利用java怎么实现一个归并排序算法

,,,,,,从图中可以看的出,对于两个相邻的整体A和B,其内的元素都是按升序排序的,现在有一个临时数组C,然后对A和B顶部的两个元素进行比较,取出较小的一个元素放入C中,对于取出元素的整体,其指向元素的下标下移一位,继续取出两个整体中顶部元素较小的一个放入C中,依次循环,当某个整体元素取完之后直接将另一个整体的元素都移入C中。对于C这个整体,其就是经过A和B排序而得到的,由于A和B是相邻的两个整体,因而,最后只需要将C中的元素复制到A和B组成的一个共同整体中即可,这样也就达到了将A和B合并的同时进行排序的目的。

,,,,,,以下是归并排序的具体算法:

公共类归并排序{
  公共静态& lt; AnyType Comparable<延伸,# 63;超级AnyType>比;无效的归并排序(AnyType [] arr) {
  AnyType [] tmp=((AnyType[])新可比[arr.length]);
  归并排序(arr arr 0。长度- 1、tmp);
  }
  
  私有静态& lt; AnyType Comparable<延伸,# 63;超级AnyType>比;空白归并排序(AnyType arr [], int, int, AnyType [] tmp) {
  如果开始& lt;) {
  int中期=(开始+结束)在祝辞1;
  归并排序(加勒比海盗,开始、中期、tmp);
  归并排序(arr + 1,中期结束,tmp);
  合并(加勒比海盗、启动、中期结束,tmp);
  }
  }
  
  私有静态& lt; AnyType Comparable<延伸,# 63;超级AnyType>比;空白合并(AnyType arr [], int, int中期,int, AnyType [] tmp) {
  int i=开始,j=+ 1,中期k=开始;
  虽然(我& lt;=中期,,j & lt;=结束){
  如果(arr[我].compareTo (arr [j]) & lt;0){
  tmp arr [k + +]=[我+ +);
  其他}{
  tmp arr [k + +]=[j + +);
  }
  }
  
  虽然(我& lt;=中期){
  tmp arr [k + +]=[我+ +);
  }
  
  而(j & lt;=结束){
  tmp arr [k + +]=[j + +);
  }
  
  for (int m=开始;m & lt;=结束;m + +) {
  arr [m]=tmp [m];
  }
  }
  }

,,,,,,代码中主要有两个方法

私有静态& lt; AnyType Comparable<延伸,# 63;超级AnyType>比;空白归并排序(AnyType arr [], int, int, AnyType [] tmp) 
私有静态& lt; AnyType Comparable<延伸,# 63;超级AnyType>比;空白合并(AnyType arr [], int, int中期,int, AnyType [] tmp) 

,,,, <强>,,第一个方法是一个递归方法强,对于递归方法,一定要明晰该方法功能的定义,这里这个递归方法的目的就是对传入数组的开始到结束之间的元素进行排序,而tmp则是一个辅助数组。在该方法的具体实现中,我们可以看的到,其思路是首先对开始到中期之间的元素继续调用递归进行排序,然后是对中期到结束之间的元素调用递归进行排序,经过这两个方法,从开始到中期和从中期到结束两部分的元素都是经过排序的,此时就需要调用第二个方法。

,,,,, <强>,,第二个方法的功能是对两个已经排序的部分进行合并强,对于第一个方法,最后一步执行了第二个方法也即对前面两步排序的部分进行合并之后也就完成了该方法的功能。而对于第二个方法,实现思路和前面描述的一样,分别从两堆牌顶取出较小的一个元素放入临时数组中,当一个牌堆取完之后就将剩下的数组的元素放入第二个牌堆,最后将临时数组的元素放回到原始数组中。

利用java怎么实现一个归并排序算法