数据结构基础2顺序查找amp

顺序查找

适用范围:

  没有进行排序的数据序列

缺点:

  速度非常慢,效率为O(N)

[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片

//实现

templatetypenameType

Type*sequenceSearch(Type*begin,Type*end,constTypesearchValue)

throw(std::range_error)

{

if((begin==end)

(begin==NULL)

(end==NULL))

throwstd::range_error("pointerunavailable");

for(Type*index=begin;indexend;++index)

{

if(*index==searchValue)

returnindex;

}

returnend;

}

templatetypenameType

Type*sequenceSearch(Type*array,intlength,constTypesearchValue)

throw(std::range_error)

{

returnsequenceSearch(array,array+length,searchValue);

}

迭代二分查找

应用范围:

  数据必须首先排序,才能应用二分查找;效率为(logN)

算法思想:

  譬如数组{1,2,3,4,5,6,7,8,9},查找元素6,用二分查找的算法执行的话,其顺序为:

  1.第一步查找中间元素,即5,由于56,则6必然在5之后的数组元素中,那么就在{6,7,8,9}中查找,

  2.寻找{6,7,8,9}的中位数,为7,76,则6应该在7左边的数组元素中,那么只剩下6,即找到了。

二分查找算法就是不断将数组进行对半分割,每次拿中间元素和目标元素进行比较。

[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片

//实现:迭代二分

templatetypenameType

Type*binarySearch(Type*begin,Type*end,constTypesearchValue)

throw(std::range_error)

{

if((begin==end)

(begin==NULL)

(end==NULL))

throwstd::range_error("pointerunavailable");

/**注意:此处high为end-1,并不是end

因为在后续的查找过程中,可能会如下操作(*high),或等价的操作

此时应该访问的是最后一个元素,必须注意不能对数组进行越界访问!

*/

Type*low=begin,*high=end-1;

while(low=high)

{

//计算中间元素

Type*mid=low+(high-low)/2;

//如果中间元素的值==要找的数值,则直接返回

if(*mid==searchValue)

returnmid;

//如果要找的数比中间元素大,则在数组的后半部分查找

elseif(searchValue*mid)

low=mid+1;

//如果要找的数比中间元素小,则在数组的前半部分查找

else

high=mid-1;

}

returnend;

}

templatetypenameType

Type*binarySearch(Type*array,intlength,constTypesearchValue)

throw(std::range_error)

{

returnbinarySearch(array,array+length,searchValue);

}

递归简介

  递归就是递归...(自己调用自己),递归的是神,迭代的是人;

递归与非递归的比较

[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片

//递归求解斐波那契数列

unsignedlongficonacciRecursion(intn)

{

if(n==1

n==2)

return1;

else

returnficonacciRecursion(n-1)+ficonacciRecursion(n-2);

}

[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片

//非递归求解斐波那契数列

unsignedlongficonacciLoop(intn)

{

if(n==1

n==2)

return1;

unsignedlongfirst=1,second=1;

unsignedlongans=first+second;

for(inti=3;i=n;++i)

{

ans=first+second;

first=second;

second=ans;

}

returnans;

}

递归二分查找

  算法思想如同迭代二分查找;

[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片

//实现

templatetypenameType

Type*binarySearchByRecursion(Type*front,Type*last,constTypesearchValue)

throw(std::range_error)

{

if((front==NULL)

(last==NULL))

throwstd::range_error("pointerunavailable");

if(front=last)

{

Type*mid=front+(last-front)/2;

if(*mid==searchValue)

returnmid;

elseif(searchValue*mid)

returnbinarySearchByRecursion(mid+1,last,searchValue);

else

returnbinarySearchByRecursion(front,mid-1,searchValue);

}

returnNULL;

}

templatetypenameType

intbinarySearchByRecursion(Type*array,intleft,intright,constTypesearchValue)

throw(std::range_error)

{

if(array==NULL)

throwstd::range_error("pointerunavailable");

if(left=right)

{

intmid=left+(right-left)/2;

if(array[mid]==searchValue)

returnmid;

elseif(searchValuearray[mid])

returnbinarySearchByRecursion(array,left,mid-1,searchValue);

else

returnbinarySearchByRecursion(array,mid+1,right,searchValue);

}

return-1;

}

小结:

  其实C++的STL已经实现好了std::binary_search(),在用的时候我们只需调用即可,但是二分算法的思想还是非常重要的,在求解一些较为复杂的问题时,我们时常能够看到二分的身影.

赞赏









































北京白癜风的费用
北京哪治疗白癜风医院收费低



转载请注明:http://www.92nongye.com/zyjs/204618435.html