归并排序
| 4 | * 归并排序 |
| 5 | */ |
| 6 | public class MergeSort implements IArraySort { |
| 7 | |
| 8 | @Override |
| 9 | public int[] sort(int[] sourceArray) throws Exception { |
| 10 | // 对 arr 进行拷贝,不改变参数内容 |
| 11 | int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); |
| 12 | |
| 13 | if (arr.length < 2) { |
| 14 | return arr; |
| 15 | } |
| 16 | int middle = (int) Math.floor(arr.length / 2); |
| 17 | |
| 18 | int[] left = Arrays.copyOfRange(arr, 0, middle); |
| 19 | int[] right = Arrays.copyOfRange(arr, middle, arr.length); |
| 20 | |
| 21 | return merge(sort(left), sort(right)); |
| 22 | } |
| 23 | |
| 24 | protected int[] merge(int[] left, int[] right) { |
| 25 | int[] result = new int[left.length + right.length]; |
| 26 | int l = 0, r = 0, len = 0; |
| 27 | while (len < left.length + right.length) { |
| 28 | if (left[l] <= right[r]) { |
| 29 | result[len++] = left[l++]; |
| 30 | |
| 31 | if (l == left.length) { |
| 32 | for (int i = r; i < right.length; i++) { |
| 33 | result[len++] = right[r++]; |
| 34 | } |
| 35 | } |
| 36 | } else { |
| 37 | result[len++] = right[r++]; |
| 38 | |
| 39 | if (r == right.length) { |
| 40 | for (int i = l; i < left.length; i++) { |
| 41 | result[len++] = left[l++]; |
| 42 | } |
| 43 | } |
| 44 | } |
| 45 | } |
| 46 | |
| 47 | return result; |
| 48 | } |
| 49 | |
| 50 | } |
nothing calls this directly
no outgoing calls
no test coverage detected