二分法列表(二分法 多分法)

2023-02-12 19:23:04 密码用途 思思

(二分法)C语言程序

1、打开Python开发工具IDLE,新建‘search.py’。

2、F5运行程序,list1被正确排序,写这个的目的是说明二分法查找必须前提是一个有序的列表,如果一开始无序首先要排序,当数据量大的时候,快速排序是一个很好的选择,再进行二分法查找。

3、用递归的思想,递归就一定有结束条件。

4、if len(li)==1:   #li长度等于1,只比较这个列表元素与要查找到值return li[0]==item。

5、if len(li)==0: #li长度等于0,全部查找结束还是没有这个值  return False。

6、为程序添加main方法。

7、F5运行程序,正确打印出二分法查找结果,False True。

二分法查找的问题

一点不矛盾:

第一个:找的顺序是15 8 10 12

第二个:找的顺序是50 90

二分法查询的时候,索引是从0开始计算的。这点你要清楚就可以很快明白了/

比如第一个例子,beginIndex = 0, endIndex = 列表的长度-1,也就是等于10

midIndex = (beginIndex + endIndex )/2,也就是5。

15 〉12 ,这时候beginIndex 不变,而endIndex 应该等于midIndex -1了,也就是4,那么下一个我们要验证索引是2的数据了。如此类推

不知是否明白?

二分法列表(二分法 多分法) 第1张

用appinventor语句,用二分法查找列表

#includestdio.h

int fun(int a[],int n,int key)

{i

nt low,mid,high;//low、mid、high是三个索引分别指向数组的下标low=0;//low指向数组a[]的第一个元素,即下表为0的元素

high=n-1;//lhigh指向数组a[]的最一个元素,即下表为n-1的元素,n为数组的长度

while(low=high)//循环终止条件是lowhigh的时候

{

mid=(low+high)/2;//所谓二分查找就在这里,每次都让mid指向数组下标等于low和high之和的一半的元素i

f(keya[mid])//如果a【mid】大于要查找的元素,说明要查找的元素在low和mid之间,这是需要把high重新置为mid-1

(high=mid-1);//这里应该是{},不能使()吧

else if(keya[mid])//这里同理,如果a【mid】小于要查找的元素,说明要查找的元素在mid和high之间,这是需要把low重新置为mid+1

(low=mid+1);

else

return mid;//剩下的就是相等的情况,直接返回mid就是查找到的结果

}

return -1;//执行到这一步就说明,lowhigh,没有找到要查找的元素,返回-1表示没有结果

}

main()

{

int a[10]={1,2,3,4,5,6,7,8,9,10};

int a,b,c;

b=4;

c=fun(a,10,b);

if(c==1)

printf("not found");

else

printf("psition %d\n",c);

}