原来在学习归并排序的时候是用C语言做的,因为指针的关系觉得很简单,但是现在学习JAVA却发现没有指针后,简单的归并排序的实现都变得好难,请那位大侠帮我分析下实现的策略,这里先感谢了,最好有源代码。

解决方案 »

  1.   

    Arrays的sort用的就是归并排序...看下源代码吧
    看这个方法
    private static void mergeSort(Object[] src,
      Object[] dest,
      int low,
      int high,
      int off)
      

  2.   

    /** *归并排序,要求待排序的数组必须实现Comparable接口 */ public class MergeSort implements SortStrategy {  private Comparable[] bridge; 
           /**        *利用归并排序算法对数组obj进行排序        */        public void sort(Comparable[] obj)        {   if (obj == null)               {    throw new NullPointerException("The param can not be null!");               } 
                  bridge = new Comparable[obj.length];                //初始化中间数组 
                  mergeSort(obj, 0, obj.length - 1);                       //归并排序               bridge = null;        } 
           /** 
           *将下标从left到right的数组进行归并排序        *@param obj 要排序的数组的句柄        *@param left 要排序的数组的第一个元素下标        *@param right 要排序的数组的最后一个元素的下标        */        private void mergeSort(Comparable[] obj, int left, int right)        {    if (left < right)               {     int center = (left + right)/2;                      mergeSort(obj, left, center);                      mergeSort(obj, center + 1, right);                      merge(obj, left, center, right);               }        }        /**        *将两个对象数组进行归并,并使归并后为升序。归并前两个数组分别有序        *@param obj 对象数组的句柄        *@param left 左数组的第一个元素的下标        *@param center 左数组的最后一个元素的下标        *@param right 右数组的最后一个元素的下标        */        private void merge(Comparable[] obj, int left, int center, int right)        {   int mid = center + 1;               int third = left;               int tmp = left;               while (left <= center && mid <= right)               {     //从两个数组中取出小的放入中间数组                      if (obj[left].compareTo(obj[mid]) <= 0)                      {      bridge[third++] = obj[left++];                      }    else                             bridge[third++] = obj[mid++];               } 
                  //剩余部分依次置入中间数组 
                  while (mid <= right)               {  bridge[third++] = obj[mid++];               } 
                  while (left <= center) 
                  {    bridge[third++] = obj[left++];               } 
                  //将中间数组的内容拷贝回原数组 
                  copy(obj, tmp, right);        } 
           /** 
           *将中间数组bridge中的内容拷贝到原数组中        *@param obj 原数组的句柄        *@param left 要拷贝的第一个元素的下标        *@param right 要拷贝的最后一个元素的下标        */        private void copy(Comparable[] obj, int left, int right)        {   while (left <= right)               {   obj[left] = bridge[left];                      left++;               } } }