您的位置:首页 > 其它

二分查找、数组合并

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()方法,并将结果目的数组显示出来。两个源数组的数据项个数可能不同。在算法中需要先比较源数组中的关键字,从中选出最小的一个数据项复制到目的数组。同时还要考虑如何解决当一个源数组的数据项已经取完而另一个还剩一些数据项情况。

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二分查找 合并