1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| public void merge(int[] arr,int start,int m,int end){
//分别计算两个分组的长度 int n1 = m - start + 1; int n2 = end - m;
//创建两个辅助数组 int[] L = new int[n1]; int[] R = new int[n2];
//将原数组的元素拷贝到辅助数组中 for (int i = 0; i < n1; i++) { L[i] = arr[start + i]; } for (int j = 0; j < n2; j++) { R[j] = arr[m+1+j]; }
//遍历两个数组,当其中任意一个数组遍历完毕的时候停止循环 int i = 0,j = 0; int k = start; while (i<n1 && j<n2){
if (L[i]<=R[j]){ //当遍历到的左边数组元素小于等于遍历到右边的数组,原数组对应位置换为左边数组遍历到的值 arr[k] = L[i]; i++; }else { //当遍历到的左边数组元素大于遍历到右边的数组,原数组对应位置换为右边数组遍历到的值 arr[k] = R[j]; j++; } k++; }
//将剩余的数组追加到原数组的尾部 while (i < n1){ arr[k] = L[i]; i++; k++; } while (j < n2){ arr[k] = R[j]; j++; k++; } }
public void sort(int[] arr,int start,int end){ if (start < end){ //中间索引 int m = (start + end)/2; //递归前半部分数组 sort(arr, start, m); //递归后后半部分数组 sort(arr, m+1, end); //排序 merge(arr, start, m, end); } }
|