心路历程: 加油努力,噢力给!!
做这道题,其实内心是很不平静的,甚至有点排斥自己,为什么这么简单的题,没有被快速做出来。但是,还是很佩服自己,能够静下心来,好好把它做好,做通过了,没有借助外界的任何提示和帮助。
解题思路:
第一种思路:
也是我实现题目通过的思路,就是先把数组挪到后面,再从前往后排序,这种虽然能够排序成功,但是,多用了一次挪动的空间,所有效率有提高空间
第二种思路:
既然是有序数组,那就从后往前排也是有序的,那就直接用A数组后面空闲的空间,让两个A、B数组的指针,从后往前排序进去就好了。所有有了第二种排序的实现方案,不需要像第一种一样,还要挪到A前面的数据到后面。
import java.util.*; public class Solution { public void merge(int A[], int m, int B[], int n) { if(n == 0) { return; } if(m == 0) { System.arraycopy(B, 0, A, 0, n); } int aEnd = m-1; int bEnd = n -1; int mergeEnd = m+n-1; while(aEnd >=0 && bEnd >=0) { if(A[aEnd]>= B[bEnd]) { A[mergeEnd] = A[aEnd]; mergeEnd--; aEnd--; } else { A[mergeEnd] = B[bEnd]; mergeEnd--; bEnd--; } } while(bEnd >=0) { A[mergeEnd] = B[bEnd]; mergeEnd--; bEnd--; } } // 从尾部倒序比较存入最好,尾部有空间,不用异位 public void merge1(int A[], int m, int B[], int n) { if (n == 0) { return; } if (m == 0) { System.arraycopy(B, 0, A, 0, n); return; } int t = m + n; // 先把A的结果放到尾部,这样方便合并的时候,不用挪位置 // 也可以直接覆盖掉。 // 这只效率太低,淘汰! // while (i >= 0) { // A[j] = A[i]; // A[i] = 0; // i--; // j--; // } // 改成这种挪动数组,高效! System.arraycopy(A, 0, A, n, m); int i = 0, j = n; i = 0; // A 容器制造 j = n; //A 数据指针 int k = 0; //B 数据指针 while (j < t && k < n) { if (A[j] <= B[k]) { A[i] = A[j]; A[j] = 0; j++; i++; } else { A[i] = B[k]; B[k] = 0; k++; i++; } } if (j < t) { System.arraycopy(A, i, A, i, t-j); } else { System.arraycopy(B, k, A, i, n-k); } } }