二分查找、数组合并
2016-02-25 16:18
225 查看
2.4修改orderedArray.java程序(清单2.4)使insert()、delete()与find()方法一样都使用 二分查找,正如书中所建议的那样。
2.5向orderedArray.java程序(清单2.4)的OrdArray类加入一个merge()方法,使之可以将两个有序的源数组合并成一个有序的目的数组。在main()中添加代码,向两个源数组中插入随机数,调用merge()方法,并将结果目的数组显示出来。两个源数组的数据项个数可能不同。在算法中需要先比较源数组中的关键字,从中选出最小的一个数据项复制到目的数组。同时还要考虑如何解决当一个源数组的数据项已经取完而另一个还剩一些数据项情况。
2.5向orderedArray.java程序(清单2.4)的OrdArray类加入一个merge()方法,使之可以将两个有序的源数组合并成一个有序的目的数组。在main()中添加代码,向两个源数组中插入随机数,调用merge()方法,并将结果目的数组显示出来。两个源数组的数据项个数可能不同。在算法中需要先比较源数组中的关键字,从中选出最小的一个数据项复制到目的数组。同时还要考虑如何解决当一个源数组的数据项已经取完而另一个还剩一些数据项情况。
public class OrdArray { private long[] a; private int nElems; public OrdArray(int max){ a = new long[max] ; nElems = 0; } public int size(){ return nElems; } public int find(long searchKey){ int lowerBound = 0; int upperBound = nElems-1; int curIn; while(true){ curIn = (lowerBound+upperBound)/2; if(a[curIn] == searchKey){ return curIn;//found it } else if(lowerBound > upperBound){ return nElems;//can't find it } else{ if(a[curIn] < searchKey){ lowerBound = curIn+1; } else{ upperBound = curIn-1; } } } } public void insert(long value){ int j; for(j = 0;j < nElems;j++){ //find where it goes if(a[j] > value){//line search break; } } for(int k = nElems;k > j;k--){ //move bigger ones up a[k] = a[k-1]; } a[j] = value; nElems++; } //========================================================== //编程作业2.4 public void insert1(long value){ if(nElems == 0){ a[0] = value; nElems++; return; } int lowerBound = 0; int upperBound = nElems -1; int curIn; while(true){ curIn = (lowerBound + upperBound) / 2; if(lowerBound > upperBound){ break; } if(a[curIn] == value){ break;//found it } else if(a[curIn] < value){ if(curIn == nElems -1){ curIn = curIn+1; break; } else if(a[curIn+1] >= value){ curIn = curIn+1; break; } else{ lowerBound = curIn+1; } } else{ if (curIn == 0) { break; } else if (a[curIn - 1] <= value) { break; } else{ upperBound = curIn - 1; } } } for(int k = nElems;k > curIn;k--){ a[k] = a[k-1]; } a[curIn] = value; nElems++; } //========================================================== //编程作业2.4 public boolean delete(long value){ int j = find(value); if(j == nElems){ return false; } else{ for(int k =j; k < nElems; k++){ a[k]=a[k+1]; } nElems--; return true; } } public void display(){ for(int j = 0;j < nElems;j++){ System.out.print(a[j] + " "); } System.out.println(""); } //========================================================= //编程作业2.5 public OrdArray merge(OrdArray ordArray){ OrdArray dist = new OrdArray(this.nElems+ordArray.nElems); int index = 0; for(int i=0;i<ordArray.size();i++){ dist.insert(ordArray.a[i]); } for(int i = 0;i < this.size();i++){ dist.insert(this.a[i]); } return dist; } }
public class OrderApp { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int maxSize =100; OrdArray arr; arr = new OrdArray(maxSize); arr.insert(77); arr.insert(99); arr.insert(44); arr.insert(55); arr.insert(22); arr.insert(88); arr.insert(11); arr.insert(00); arr.insert(66); arr.insert(33); int searchKey = 55; if(arr.find(searchKey)!= arr.size()){ System.out.println("Found "+searchKey); } else{ System.out.println(" Can't find "+searchKey); } arr.display(); arr.delete(00); arr.delete(55); arr.delete(99); arr.display(); arr = new OrdArray(maxSize); arr.insert1(1); arr.insert1(2); arr.insert1(3); arr.insert1(4); arr.display(); System.out.println("第二个数组:"); OrdArray arr1 = new OrdArray(maxSize); arr1.insert(10); arr1.insert(20); arr1.insert(30); arr1.insert(40); arr1.insert(50); arr1.insert(60); arr1.insert(70); arr1.display(); System.out.println("合并两个数组,生成新的数组:"); OrdArray arr2 = arr.merge(arr1); arr2.display(); } }
相关文章推荐
- 用VBScript写合并文本文件的脚本
- oracle列合并的实现方法
- 使用BAT一句话命令实现快速合并JS、CSS
- SQL 合并多行记录的方法总汇
- C#实现简单合并word文档的方法
- C#自适应合并文件的方法
- Node.js实现JS文件合并小工具
- C++二分查找在搜索引擎多文档求交的应用分析
- C语言编程中实现二分查找的简单入门实例
- C#二分查找算法实例分析
- GridView单元格合并
- 如何合并多个 .NET 程序集
- 使用UglifyJS合并/压缩JavaScript的方法
- 高性能WEB开发 JS、CSS的合并、压缩、缓存管理
- 多个js与css文件的合并方法详细说明
- 使用不同的方法结合/合并两个JS数组
- 合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
- 用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
- oracle实现多行合并的方法
- php分割合并两个字符串的函数实例