1 import java.util.Random;
2
3 public class MergeSort {
4 private double[] bridge;//辅助数组
5
6 public void sort(double[] obj){
7 if (obj == null){
8 throw new NullPointerException("The param can not be null!");
9 }
10 bridge = new double[obj.length]; // 初始化中间数组
11 mergeSort(obj, 0, obj.length - 1); // 归并排序
12 bridge = null;
13 }
14
15 private void mergeSort(double[] obj, int left, int right){
16 if (left < right){
17 int center = (left + right) / 2;
18 mergeSort(obj, left, center);
19 mergeSort(obj, center + 1, right);
20 merge(obj, left, center, right);
21 }
22 }
23
24 private void merge(double[] obj, int left,
25 int center, int right){
26 int mid = center + 1;
27 int third = left;
28 int tmp = left;
29 while (left <= center && mid <= right){
30 // 从两个数组中取出小的放入中间数组
31 if (obj[left]-obj[mid]<=10e-6){
32 bridge[third++] = obj[left++];
33 } else{
34 bridge[third++] = obj[mid++];
35 }
36 }
37
38 // 剩余部分依次置入中间数组
39 while (mid <= right){
40 bridge[third++] = obj[mid++];
41 }
42 while (left <= center){
43 bridge[third++] = obj[left++];
44 }
45 // 将中间数组的内容拷贝回原数组
46 copy(obj, tmp, right);
47 }
48
49 private void copy(double[] obj, int left, int right)
50 {
51 while (left <= right){
52 obj[left] = bridge[left];
53 left++;
54 }
55 }
56
57 public static void main(String[] args) {
58 Random random = new Random(6);
59
60 int arraysize = 10;
61 double[] sorted = new double[arraysize];
62 System.out.print("Before Sort:");
63 for (int j = 0; j < arraysize; j++) {
64 sorted[j] = (int) (random.nextDouble() * 100);
65 System.out.print((int) sorted[j] + " ");
66 }
67 System.out.println();
68
69 MergeSort sorter = new MergeSort();
70 sorter.sort(sorted);
71
72 System.out.print("After Sort:");
73 for (int j = 0; j < sorted.length; j++) {
74 System.out.print((int) sorted[j] + " ");
75 }
76 System.out.println();
77 }
78
79 }