开始想法:nums2 接着nums1 后面全都存进去,直接Arrays.sort解决,后来看了一下归并排序,发现就是一次合并的过程。
简单题,记录一下。
思路:开一个数组与nums1大小相同(int[] temp = new int[nums1.length])。在来一个int t = 0;m,n分别是两个数组中有效的数字个数(两个数组有序).分别从0到m-1 / 从0到n-1比较nums1与nums2的值,谁小就存到temp[t++]中.这样存完之后会剩下较大的值,因为数组已经排好顺
序,nums2里面有剩余的较大值,就再把剩下的值存到temp[]中.
最后将temp中的值全部拷贝到nums1中
完毕
附上代码
public class Mmerge {
public static void merge(int[] nums1, int m, int[] nums2, int n) {
int i = 0;
int j = 0;
int t = 0;
int[] temp = new int[nums1.length];
while(i < m && j < n)
temp[t++] = nums1[i] > nums2[j] ? nums2[j++] : nums1[i++];
while(i < m) {
System.out.println("执行1");
temp[t++] = nums1[i++];
}
while(j < n) {
System.out.println("执行2");
temp[t++] = nums2[j++];
}
t = 0;
int k = 0;
while(t < nums1.length)
nums1[k++] = temp[t++];
}
public static void main(String[] args)
{
// Arrays.sort();
// Arrays.asList()
int[] a = new int[] {1,2,3,0,0,0};
int[] b = new int[] {2,5,6};
merge(a,3,b,3);
for(int h : a)
System.out.print(h+" ");
//输出结果 1 2 2 3 5 6
//多记录一下,将a[]中换成{1,7,8,0,0,0} 则 在第一个while中:7,8这两个值会余下,在第二个while中(i < m)成立,则将7,8放在temp[4]与temp[5]之中。
}
}
记录一点其他知识(从其他文章获得,觉得容易理解) 关于时间复杂度,算法的基本操作重复执行次数是模块n的某一函数f(n),
算法的时间复杂度记为T(n) = O(f(n)),随着n的增大,算法执行的时间增长率f(n)的增长率成正比
于是,f(n)越小,算法时间复杂度小,算法效率高
根据归并排序的时间复杂度 Nlogn 计算了一下
6*100w = 6000000次就可以了
跟冒泡比较一下,冒泡是 100w * 100w 次 归并是 6 * 100w 次
完毕
有不对的地方请指正,希望与大家多多交流。