有序数组

public class OrderArray {
	private int[] array;
	private int length;//数组元素个数
	//构造方法,传入数组的最大长度
	public OrderArray(int max){
		array = new int[max];
	}
	//用二分查找定位某个元素,如果存在,返回其下标,不存在返回-1
	public int find(int target){
		int left = 0;
		int right = length - 1;
		int mid = 0;
		while(left<=right){
			mid = (left + right)/2;
			if(target<array[mid]){
				right = mid - 1;
			}else if(target>array[mid]){
				left = mid + 1;
			}else{				
				break;
			}
	}
		//跳出循环只有两种结果,要么找到,要么没有找到
		if(array[mid] == target){
			return mid;
		}else{
			return -1;
		}
	}	
	//插入:分两步
	public void insert(int item){
		int location = 0;
		//1:先找到插入的位置,一旦找到位置,必须赶紧退出循环
		for(;location < length;location++){
			if(item<array[location]){
				break;
			}
		}
		//2:然后元素的移动
		for(int index = length;index>location;index--){
			array[index] = array[index-1];
		}
		array[location] = item;
		length++;
	}
	//删除某个元素,删除成功返回true,删除失败返回false               
	public boolean delete(int target){
		int index = -1;
		if((index = find(target))!=-1){
			for(int i = index;i<length -1;i++){
			   array[i] = array[i+1];
		}
		length --;
		return true;
	}else{
		return false;
	}
}
	//列出所有元素
	public void display(){
		for(int i = 0;i<length;i++){
			System.out.print(array[i] + " ");
		}
		System.out.println();
	}
	public static void main(String[] args){
		OrderArray orderArray = new OrderArray(10);
		orderArray.insert(3);
		orderArray.insert(4);
		orderArray.insert(7);
		orderArray.insert(5);
		orderArray.insert(6);
		orderArray.insert(2);
		orderArray.display();
		int k = orderArray.find(5);
		System.out.println("该元素的下标是:" + k);
	}
}

运行结果:

2 3 4 5 6 7 
该元素的下标是:4

 

同样都是二分查找,还可以用下面这种方法:

public int find(int target){
		int left = 0;
		int right = length - 1;
		int mid;
		while(true){
			mid = (left + right)/2;
			if(target == array[mid]){
				return mid;
			}else if(left == mid){
				if(target == array[right]){    //当该搜索段只有一个或者两个元素时,排除了target==array[mid]这种情况
					return right;
				}else{
					return -1;       //该搜索段没有目标target元素
				}		
			}else{
				// 搜索段中的元素至少有三个,且当前元素不等于目标元素
				if(target<array[mid]){
					right = mid - 1;
				}else{
					left = mid + 1;
				}
			}
		}
	}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值