黑马程序员____顺序查找算法

----------------------android培训java培训、期待与您交流! ----------------------

 

        顺序查找(Sequential Search)也称线性查找(Liner  Search)是最为简单的查找算法形式,当然,它的查找效率也是最低的。从开始元素起,它按顺序的方式依次检查每个元素,直到找到要查找的元素或到达数组末尾为止。

         例如你在一辆行驶的列车上寻找某人时,你也许会使用顺序查找的方式来进行寻找,如图1所示。

          

                                                                                图1  顺序查找

算法2.1 顺序查找

         前提条件(输入):s={ n各类型为x的有序值序列。

         后置条件(输出)当某个 时,返回索引值I,否则,返回-1

1.       重复步骤2~3 n次,从i0n-1

2.       (不变式)子序列{ }中没有与x相等的元素。

3.       假如  

4.       返回 -1

在算法2.1中,我们使用前提和后置条件来说明算法的功能,并用循环不变式来证明算法的正确性。对每个算法均给出Java代码实例。

1 顺序查找

public static int sequentialSearch(int [] a,int x)
	{
		//前提条件:returns i; if i>=0, then a[i] == x;
		//				otherwise i == -1;
		for (int i = 0; i<a.length ;i++ )			         //步骤1
			//不变式:if a[k] == x then i<=k<a.length;		//步骤2
			//不变式:a[k]!=x,for 0<=k<i;			//步骤2
			if(a[i]==x) return i;				//步骤3
		return -1;						//步骤4
	}

定理1 顺序查找算法是正确的

         证明:当n=0时,序列为空,所以循环体将不会被执行,只有步骤4将被执行,立即返回-1 。此时它满足后置条件:x不等数组中的任意一个元素,因为数组为空时它没有任何元素。

         n=1时,循环迭代依次,此时i=0,在此次循环中,s0=xs0=x。当s0=x时返回0,并满足后置条件。当s0=x时,循环将被终止,不走4将被执行,返回-1。此时它满足后置条件:序列中的那个单一元素不等于x

         假如n>1,则在循环中的第一次迭代中,i=0,子序列{s0...si-1}为空,所以第二步中的循环不变式自然为真。在第三步时,s0=xs0=x,当s0=x时,返回0,并满足后置条件。当s0=x时循环将被继续进行。当存在第二次迭代时(也就是说s0=x),则i=1,由于子序列{s0...si-1}等于{s0} 并且s0=x,所以第二步中的不变式再次为真。

         假设在循环迭代的第k次中,循环不变式为真,即子序列{s0...si-1 }中没有一个元素等于x,则在该次迭代中,在第三步时,s0=xs0=x。当s0=x时,返回k,并满足后置条件。当s0=x时,循环将被继续进行。

         由数学归纳原理可知,在每一个循环迭代之后,算法要么在后条件为真的情况下终止,要么用于下次迭代的循环不变式为真。因此,假如在任意步中没有终止,则在最后迭代之后(i=n-1),对于i=n次迭代时,用于该次迭代的循环不变式为真,也就是说,子序列{s0...si-1 }中没有任意元素等于x。此时,将返回-1,并满足后置条件。

         下面的定理中使用了O()记号。

定理2 顺序查找算法的运行时间是On

证明:如果x 位于序列中,假设在i处,x=si ,且i<n,则循环将迭代i次。在这种情况下,运算时间正比于I,即为O(n)(因为i<n)

假如x不在序列中,循环将迭代n次,使得运行时间正比于n,也就是O(n)

例2 测试顺序查找算法

import schaums.dswj.ArraysDemo;
public class Testingss 
{
	private static final int SIZE = 16;
	private static final int START = 40;
	private static final int RANGE = 20;
	private static int [] a = new int[SIZE];
	public static void main(String [] args)
	{
		ArraysDemo.load(a,START,RANGE);
		ArraysDemo.print(a);
		test();
		test();
		test();
		test();
	}
	public static void test()
	{
		int x = ArraysDemo.load(START,RANGE);
		System.out.print("Searching for x = " + x + ":\t");
		int i = ArraysDemo.sequentialSearch(a,x);
		if (i >=0 ) System.out.println("a[" + i +"] = "+a[i]);
		else System.out.println("i = " + i + " ==> x not found");
	}
}

       该程序的输出结果为:

      

       本程序测试顺序查找算法,在有load()产生的数组上进行4次查找。第一次找x=43,但失败返回-1。第二次查找x=53,并在a[5]处找到该元素。第三次查找小x=59,但失败返回-1。第四次查找x=56,并在a[15]处找到该元素。注意该值也存在于a[10]处。顺序查找算法一旦找到目标,就放弃对数组中其余部分的查找。

为了访问的方便,每个数组查找算法均加入到achuams.dswj.ArraysDemo类中。例如,对顺序查找算法的测试,我们呢将该类引入,然后调用ArraysDemo.sequentialSearch()即可。

 

 


 

 

 

---------------------- android培训java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值