题目原文:

Suppose that the subarray a[0] to a[n-1] is sorted and the subarray a[n] to a[2*n-1] is sorted. How can you merge the two subarrays so that a[0] to a[2*n-1] is sorted using an auxiliary array of length n (instead of 2n)

分析:

对两个大小分别为n的有序子数组进行归并,要求空间复杂度为n,正常情况下归并排序在此处的空间复杂度为2n,但是由于两个子数组分别是有序的,故用大小为n的额外子空间辅助归并是个很合理的要求,实现如下:

 import java.util.Arrays;
import edu.princeton.cs.algs4.StdRandom; public class MergeSortedSubArray {
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
public static void merge(Comparable[] array){
int n = array.length/2;
Comparable[] aux = new Comparable[n];
for(int i=0;i<n;i++){ //取左半边sorted的元素至辅助数组,因为未来归并左侧位置可能会被右侧元素占据
aux[i] = array[i];
}
System.out.println(Arrays.toString(aux));
int l = 0;
int r = n;
for(int k = 0; k<2*n;k++){
if(l >= n) break;//辅助元素数组全部用完,array右侧不需要挪动位置了
else if(r>=2*n) array[k]=aux[l++];//array原右侧元素全部放置合适位置,后面只需把辅助数组的元素挪到array右侧
else if(less(array[r],aux[l])) array[k] = array[r++];
else array[k] = aux[l++];
}
} public static void main(String[] args){
int n = 10;
int[] subarray1 = new int[n];
int[] subarray2 = new int[n];
for (int i = 0; i < n; i++) {
subarray1[i] = StdRandom.uniform(100);
subarray2[i] = StdRandom.uniform(100);
}
Arrays.sort(subarray1);
Arrays.sort(subarray2);
Integer[] array = new Integer[2*n];
for(int i = 0; i<n;i++){
array[i] = subarray1[i];
array[n+i] = subarray2[i];
}
System.out.println(Arrays.toString(array));
merge(array);
System.out.println(Arrays.toString(array));
}
}

最新文章

  1. 小程序https Android 安卓可以发request请求,IOS 苹果 发请求失败问题
  2. KVM 基本命令
  3. fuelphp 问题1
  4. jquery左右链接类似frameset的插件
  5. [CareerCup] 15.5 Denormalization 逆规范化
  6. 由linux下的多进程编程引发的关于进程间隔离的思考
  7. jmeter之json数据参数化 断言等
  8. onkeyup,onkeydown和onkeypress
  9. Oracle job procedure
  10. 延时过程中要加上app.processEvents(),进度条里也要加上这句
  11. java 将GBK编码文件转为UTF-8编码
  12. Serv-U执行CMD命令
  13. Windows下安装虚拟机和Linux
  14. .NET Core 性能分析: xUnit.Performance 简介
  15. 2018-2019-2 20165337《网络对抗技术》Exp2 后门原理与实践
  16. Echarts CPU监控 (折线仪表盘,图例混搭)
  17. C#读取Excel文件的简单方法
  18. juqery 下拉加载数据
  19. vlookup返回多个结果
  20. MySQL递归查询树状表的子节点、父节点具体实现

热门文章

  1. 3星|《刷新》:微软第三任CEO上任三年后的回顾
  2. CSS3设计炫目字体
  3. http通信流程
  4. 10.3 io流 正篇 FileReader FileWriter读写代码
  5. DOCKER - POD操作
  6. HDU 2414 Chessboard Dance(模拟题,仅此纪念我的堕落)
  7. uva 524(Prime Ring Problem UVA - 524 )
  8. 我理解的数据结构(一)—— 数组(Array)
  9. IE7浏览器下去除flash动画边框问题
  10. Thinkphp5跨域问题