代码改变世界

归并排序

2011-07-10 11:28  卫佳  阅读(178)  评论(0编辑  收藏  举报

 

package Utils.Sort; 

*归并排序,要求待排序的数组必须实现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);   //归并排序 Wholesale designer sunglasses

              bridge = null; 

       } 

       *将下标从leftright的数组进行归并排序 

       *@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); //Wholesale Discount Sunglasses

                     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) 

              {                   //Acetate Sunglasses

                     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++]; 

              } 

              //Metal Sunglasses

              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++; 

              } 

       } 

}