《Java数据结构与算法》第2章——数组

假设数组的长度为N,则:

操作不允许重复允许重复
查找N/2次比较N次比较
插入无比较,一次移动无比较,一次移动
删除N/2次比较,N/2次移动N次比较,多于N/2次移动

二分查找算法

二分查找所需的比较次数

范围所需比较次数
104
1007
100010
1000014
10000017
100000020
1000000024
10000000027
100000000030

示例

package secondchapter;

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;
			else if (lowerBound > upperBound)
				return nElems;
			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++)
			if (a[j] > value)
				break;
		for (int k=nElems; k>j; k--)
			a[k] = a[k-1];
		a[j] = value;
		nElems++;
	}
	
	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("");
	}
}

public class OrderedApp {

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

结果:
Found 55
0 11 22 33 44 55 66 77 88 99
11 22 33 44 66 77 88

用大O表示法表示运行时间

算法大O表示法表示的运行时间
线性查找O(N)
二分查找O(logN)
无序数组的插入O(1)
有序数组的插入O(N)
无序数组的删除O(N)
有序数组的删除O(N)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值