归并排序

本文详细介绍了归并排序的原理与过程,通过分解和合并有序子序列来实现整个序列的排序。提供了完整的Java代码示例,展示了如何使用辅助数组进行归并操作,以及如何递归地对子序列进行排序。

将两个或两个以上的有序表组合成一个新的有序表。归并排序要使用一个辅助数组,大小跟原数组相同,递归做法。每次将目标序列分解成两个序列,分别排序两个子序列之后,再将两个排序好的子序列merge到一起。


归并排序Java代码:

public class MergeSort { 

     private double[] bridge;//辅助数组

     public void sort(double[] obj){

         if (obj == null){

              throw new NullPointerException("The param can not be null!");

         }

         bridge = new double[obj.length]; // 初始化中间数组

         mergeSort(obj, 0, obj.length - 1); // 归并排序

         bridge = null;

     }

     private void mergeSort(double[] 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);

         }

     }

     private void merge(double[] 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]-obj[mid]<=10e-6){

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

     }

     private void copy(double[] obj, int left, int right)

     {

         while (left <= right){

              obj[left] = bridge[left];

              left++;

         }

     }

     public static void main(String[] args) {

         Random random = new Random(6);



         int arraysize = 10;

         double[] sorted = new double[arraysize];

         System.out.print("Before Sort:");

         for (int j = 0; j < arraysize; j++) {

              sorted[j] = (int) (random.nextDouble() * 100);

              System.out.print((int) sorted[j] + " ");

         }

         System.out.println();



         MergeSort sorter = new MergeSort();

         sorter.sort(sorted);



         System.out.print("After Sort:");

         for (int j = 0; j < sorted.length; j++) {

              System.out.print((int) sorted[j] + " ");

         }

         System.out.println();

     }

}

转载于:https://www.cnblogs.com/yuyu666/p/9828086.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值