java 数组插入,二分法

来源:互联网 发布:祁东农村淘宝招募电话 编辑:程序博客网 时间:2024/06/05 21:06
package com.datastruct;public class OrdArray {private long [] a;private int nElems=0;public OrdArray(int max){a=new long[max];}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; }else if(lowerBound>upperBound){ return nElems; }else { if(a[curIn]>searchKey){ upperBound=curIn-1; }else{ lowerBound=curIn+1; } } }} public void insert(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; }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++; }  public boolean delete(long value){ int j=this.find(value); if(j==nElems){ return false; } 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.println(a[j]); } }}
package com.datastruct;public class OrdArrayApp {public static void main(String [] args){int maxSize=100;OrdArray 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);arr.disPlay();}}



0 0
原创粉丝点击