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;
}
}
}
}