1 public class guiBing {
2 private static void MergeSort(int[] a,int start,int end){
3 if(start < end){
4 //找分割位置
5 int middle = (end + start) / 2;
6 //递归分割下去,左边,右边
7 MergeSort(a,start,middle);
8 MergeSort(a,middle + 1,end);
9 //该合并了
10 merge(a,start,middle,end);
11 }
12 }
13
14 public static void merge(int[] list,int start,int middle,int end){
15 //leftLength和rightLength分别表示左边序列和右边序列的长度。左边从start开始包括middle,右边从middle+1开始
16 int leftLength = middle - start + 1;
17 int rightLength = end - middle;
18 //定义俩个空的容器,将list分为左、右俩个序列,便于最后的排序
19 int L[] = new int[leftLength];
20 int R[] = new int[rightLength];
21 //定义下标:L、R、list
22 int lIndex = 0;
23 int rIndex = 0;
24 int listIndex = 0;
25
26 //赋值 L 和 R
27 for (lIndex = 0,listIndex = start; lIndex < leftLength; lIndex++,listIndex++) {
28 L[lIndex] = list[listIndex];
29 }
30
31 for (rIndex = 0,listIndex = middle + 1; rIndex < rightLength; rIndex++,listIndex++) {
32 R[rIndex] = list[listIndex];
33 }
34
35 //弟兄们,我要开始合体了,小的给我排前面去
36 for(lIndex = 0,rIndex = 0,listIndex = start;
37 lIndex < leftLength && rIndex < rightLength;
38 listIndex++){
39 //谁小谁先放进list中
40 if(L[lIndex] <= R[rIndex]){
41 list[listIndex] = L[lIndex];
42 lIndex++;
43 } else {
44 list[listIndex] = R[rIndex];
45 rIndex++;
46 }
47 }
48 //将 L/R中 剩下的元素 放入 list,另外下面这俩个if,只会执行一个
49 if(lIndex < leftLength){
50 for (int tempIndex = lIndex; tempIndex < leftLength; tempIndex++,listIndex++) {
51 list[listIndex] = L[tempIndex];
52 }
53 }
54
55 if(rIndex < rightLength){
56 for (int tempIndex = rIndex; tempIndex < rightLength; tempIndex++,listIndex++) {
57 list[listIndex] = R[tempIndex];
58 }
59 }
60 }
61
62 public static void main(String[] args) {
63 int i=0;
64 int a[] = {5,4,9,8,7,6,0,1,3,2};
65 int len = a.length;
66 MergeSort(a,0,len-1);
67 for(i=0; i<len; i++){
68 System.err.print(a[i]+" ");
69 }
70 }
71 }
![]()