请教一个数组的问题
已知不重复且已经按从小到大排好的m个数组A[1,m](为简单起见还设m=2^k,k是一个确定的非负整数)对于给定的整数c,要求寻找一个下标i,使得A[i]=c,若找不到,...
已知不重复且已经按从小到大排好的m个数组A[1,m] (为简单起见 还设m=2^k, k是一个确定的非负整数) 对于给定的整数c ,要求寻找一个下标 i ,使得A[i]=c,若找不到,则返回一个0.(两种算法)
在线等,谢谢!!!! 展开
在线等,谢谢!!!! 展开
1个回答
展开全部
算法1:对分查找
算法思想是:
每次总是将要查找的数据与待查找区间的中间位置元素进行比较,若相等,则已经找到;若大于中间元素,则下一步在右半段继续查找;若小于中间元素,则下一步在左半段继续查找。
据此,可设计出如下操作步骤:
step1. l=1; r=m;found=0;
step2. n=(l+r)/2; //中间位置
step3. 如果“还未找到”并且“还有待查找区间”,则执行下面操作:否则转step4
如果c=a[n],则found=1; 即找到,转step4
如果c>a[n],则l=n+1,转到step2
如果c<a[n],则r=n-1,转到step2
step4.如果found=1,则返回n,否则返回0。
算法2:顺序查找
这比较简单:
下操作步骤:
step1. 对于i=1,2,3,...,m执行如下操作
如果c=a[n], 则跳出循环,即:转step2
step2.如果i<=m, 则返回i,否则返回0。
算法思想是:
每次总是将要查找的数据与待查找区间的中间位置元素进行比较,若相等,则已经找到;若大于中间元素,则下一步在右半段继续查找;若小于中间元素,则下一步在左半段继续查找。
据此,可设计出如下操作步骤:
step1. l=1; r=m;found=0;
step2. n=(l+r)/2; //中间位置
step3. 如果“还未找到”并且“还有待查找区间”,则执行下面操作:否则转step4
如果c=a[n],则found=1; 即找到,转step4
如果c>a[n],则l=n+1,转到step2
如果c<a[n],则r=n-1,转到step2
step4.如果found=1,则返回n,否则返回0。
算法2:顺序查找
这比较简单:
下操作步骤:
step1. 对于i=1,2,3,...,m执行如下操作
如果c=a[n], 则跳出循环,即:转step2
step2.如果i<=m, 则返回i,否则返回0。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询