有序数组与二分查找

//OrderArray.java
public class OrderArray {
	private int[] a;

	private int nElements;

	public OrderArray(int max) {
		a = new int[max];
		nElements = 0;
	}

	public void insert(int element) {
		if (nElements == a.length) {
			System.out.println("can't insert, array is full.");
			return;
		}
		int j;
		for (j = 0; j < nElements; j++)
			if (a[j] > element)
				break;
		int k;
		for (k = nElements; k > j; k--)
			a[k] = a[k - 1];
		a[j] = element;
		nElements++;
	}

	/**
	 * 二分查找元素
	 * 
	 * @param element
	 * @return
	 */
	public int binarySearch(int element) {
		int lowerBound = 0;
		int upperBound = nElements - 1;
		int binaryBound;
		while (true) {
			binaryBound = (lowerBound + upperBound) / 2;
			if (a[binaryBound] == element) // 找到了
				return binaryBound;
			else if (lowerBound > upperBound) // 404
				return -1;
			else if (a[binaryBound] > element)
				upperBound = binaryBound - 1;// 二分搜索区间
			else
				lowerBound = binaryBound + 1;// 二分搜索区间
		}
	}

	public boolean delete(int element) {
		int j = binarySearch(element);
		if (j == -1)
			return false;
		int k;
		for (k = j; k < nElements - 1; k++)
			a[k] = a[k + 1];
		a[nElements - 1] = 0;
		nElements--;
		return true;
	}

	public void display() {
		StringBuffer sb = new StringBuffer();
		sb.append("[");
		int j;
		for (j = 0; j < a.length; j++) {
			sb.append(a[j] + ",");
		}
		sb.deleteCharAt(sb.length() - 1);
		sb.append("]");
		System.out.println(sb.toString());
	}
}

//Main.java
public class Main {
	public static void main(String[] args){
		OrderArray orderArray = new OrderArray(10);
		orderArray.insert(111);
		orderArray.insert(888);
		orderArray.insert(333);
		orderArray.insert(222);
		orderArray.insert(666);
		orderArray.insert(555);
		orderArray.insert(444);
		orderArray.insert(999);
		orderArray.insert(777);
		orderArray.insert(1111);
		orderArray.insert(2222);
		orderArray.display();
		System.out.println(orderArray.binarySearch(88));
		System.out.println(orderArray.binarySearch(1000));
		System.out.println(orderArray.delete(333));
		System.out.println(orderArray.binarySearch(999));
		System.out.println(orderArray.delete(555));
		orderArray.insert(555);
		orderArray.insert(555);
		orderArray.display();
	}
}

输出结果:
can't insert, array is full.
[111,222,333,444,555,666,777,888,999,1111]
-1
-1
true
7
true
[111,222,444,555,555,666,777,888,999,1111]

猜你喜欢

转载自samkee.iteye.com/blog/2226492