10.16原2分查找有序数列(递归到首尾下标相同结束)。假设数列a(n)=n;X为2的100次方,有序表为a(1~x),那找这个【其实任意】有序表(n个数)里的【任意】一个数,递归函数都要做M次【下面的(1)情况】或者M+1次【下面的(2)情况】(M为log2(n)去掉小数点后的到的整数)】,如上面那个要100次(即使是找1或X),【改后】的只要原表或递归切割出来的子表的首或尾出现“查找数”就找到了;
简单的修改:
///
只要【原表】的【首下标】和【尾下标】没有问题,那就不会进入外层的else中(因为当子表只有2个数时就已经退出了;
if(首下标<尾下标)///
{
if(首位数==查找数)位置为首下标;//结束(没递归)
else if(末位数==查找数)位置为尾下标;//同上
else
{
if(首下标==尾下标-1){没有这个数;//退出递归(报错)}//只有2个数,有首尾都不是。。。
else//多于3个数,继续切割。。
{
照写;递归
}
}
}
else/表里只有一个数,或前后下标有问题。
{
if(首位数==查找数)位置为下标;//
else 报错;//下标有问题,或没有这个数;
}
以下为基于【修改前】的【倒数第2或3次递归的前面的原表或子表】都没有出现首或尾为“查找数”的情况。。。
//
在以下情况下,【改后】和【改前】的运算速度的比较【基于【修改前】2分查找的比较】:
(1)当“查找数”在序列表的倒数第二次递归的子表中时
{
1. 如果子表个数为2,那改后的速度快 ;//改前的还得再切一次
2.如果子表个数为3,【而且“查找数”为3个里的最后一个】,那还是【改后】快;//【改前】的还得再切一次
(注:切法是有偶数个时左右个数相同,奇数个时左边比右边多一个)
}
///【以上这2禾中情况是2分查找里速度最快的情况】(如1,2,3,4,5)找1或2切了3次;找3或4或5只切了两次,即【(1)中的情况比(2)中的少切了一次】
(2) 1.如果子表个数为3,而且【“查找数”为3个里的中间那个】,则此次为【【改前】倒数第三次递归】【【改后】则是倒数第二次】),【改前的】得在切2次,【改后】的只要切一次;
改后则不用(速度快了);
2.如果子表个数为3,而且【“查找数”为3个里的第一个】,则此次为【【改前】倒数第三次递归】;【【改后】则结束了】;
(3)当没有这个“查找数”时,【改后】速度照样比【改前】快(因为【改后】的递归到只有2个数时就结束了,而【改前】的要到1个数是才结束);
*【【改前的2分查找只有以上3种情况,好像没有其它的情况了(注:无论找数列里的哪个数都是要递归到只剩下1个数才停】】
*【【改后的,只要在其原表,或其分割出的任意一个子表的首尾出现“查找数”就可以停了】】