数据结构大总结系列之查找
前言:
近来对各种算法的研究中,发现会用到大量的基本查找和排序算法,如折半查找,二叉查找树,快速排序,堆排序,归并排序等等,心血来潮,于是特对其做一个总结,作为一种模板库,以后便可性手捏来。
废话不多说,下面从各种查找算法入手,排序算法的总结在稍后的章节进行总结。
一,顺序表的查找:
这是最简单的查找,就是从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,直到查找成功过,算法的平均查找长度为3/4(n+1)。
二,有序表的查找(折半查找):
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
#include <iostream>
using namespace std;
int binSearch(const int *Array,int start,int end,int key) {
int left=start,right=end;
int mid=0;
while (left<right) { //注释中为递归算法,执行效率低,不推荐
mid=left+(right-left)/2; //防止溢出,编程之美260页
/* if (key<Array[mid]) {
return(binSearch(Array,left,mid,key));
}
else if(key>Array[mid]){
return (binSearch(Array,mid+1,right,key));
}
else
return mid;
*/
if (key<Array[mid]) {
right=mid-1;
}
else if(key>Array[mid]){
left=mid+1;
}
else
return mid;
}
return -1;
}
int main(){
int Array[5]={1,2,3,4,5};
cout<<binSearch(Array,0,4,3)<<endl;
}
三,二叉查找树:
二叉查找树种的左子树均小于它的根,右子树均大于它的根。
就