查找算法之折半搜索算法
2015-10-08 08:40
225 查看
A,折半查找算法:该算法是在一个有序表中查找给定的元素,并返回该元素的所在序列的下标或者查找失败返回一个代表失败的数,比如-1代表查找失败。
B,算法原理:
1)给定有序序列a1,a2,a3,...,an,升序排列;
2)查找指定元素e在序列中的下标,首先用e与array[n/2]比较大小;
3)如果e小,则继续在0-n/2之间的元素中去找,否则到n/2-n之间的元素中去找;
4)重复 2) 和 3)过程,直到找到该元素返回下标,或者查找失败返回-1,查找结束。
下面为查找给定元素的过程:
给定序列:1,3,6,9,12,15,16,21,24(元素个数n = 9),查找元素4并返回其下标。
1)4 和 array[9/2] =9比较,4小;
2)接着4和array[4/2]=3比较,4大;
3)然后4和array[(3+4)/2]=6比较,4小;
4)此时3没有元素可比较,该元素不存在返回-1,查找结束。
C,算法实现:
#include"iostream"
usingnamespace std;
intmain()
{
int search(int[], int, int, int);
int array[] = {1,3,6,9,12,15,16,21,24};
int n = sizeof(array)/sizeof(int*);
int elem, index;
cout<<"输入要查找的元素:";
cin>>elem;
index = search(array, 0, n-1, elem);
cout<<index<<endl;
return 0;
}
//array为有序数组,elem为待查找元素,low和high分别是目标数组的第一个和最后一个元素的下标
intsearch(int array[], int low, int high, int elem)
{
//如果没找到,返回-1
if(low > high)
return -1;
int mid = (low + high)/2;
//如果找到则返回该元素下标
if(elem == array[mid])
return mid;
//去mid左边元素中去查找
else if(elem < array[mid])
return search(array, low, mid-1, elem);
//去mid右边元素中去查找
else
return search(array, mid+1, high, elem);
}
运行结果:
D,复杂度分析
(a)时间复杂度:我们可以用一颗二叉树描述整个查找过程,n个元素高度为logn,而每次比较过程复杂度都为O(1),所以折半查找时间复杂度为O(logn);
(b)空间复杂度:空间复杂度为O(1)。
B,算法原理:
1)给定有序序列a1,a2,a3,...,an,升序排列;
2)查找指定元素e在序列中的下标,首先用e与array[n/2]比较大小;
3)如果e小,则继续在0-n/2之间的元素中去找,否则到n/2-n之间的元素中去找;
4)重复 2) 和 3)过程,直到找到该元素返回下标,或者查找失败返回-1,查找结束。
下面为查找给定元素的过程:
给定序列:1,3,6,9,12,15,16,21,24(元素个数n = 9),查找元素4并返回其下标。
1)4 和 array[9/2] =9比较,4小;
2)接着4和array[4/2]=3比较,4大;
3)然后4和array[(3+4)/2]=6比较,4小;
4)此时3没有元素可比较,该元素不存在返回-1,查找结束。
C,算法实现:
#include"iostream"
usingnamespace std;
intmain()
{
int search(int[], int, int, int);
int array[] = {1,3,6,9,12,15,16,21,24};
int n = sizeof(array)/sizeof(int*);
int elem, index;
cout<<"输入要查找的元素:";
cin>>elem;
index = search(array, 0, n-1, elem);
cout<<index<<endl;
return 0;
}
//array为有序数组,elem为待查找元素,low和high分别是目标数组的第一个和最后一个元素的下标
intsearch(int array[], int low, int high, int elem)
{
//如果没找到,返回-1
if(low > high)
return -1;
int mid = (low + high)/2;
//如果找到则返回该元素下标
if(elem == array[mid])
return mid;
//去mid左边元素中去查找
else if(elem < array[mid])
return search(array, low, mid-1, elem);
//去mid右边元素中去查找
else
return search(array, mid+1, high, elem);
}
运行结果:
D,复杂度分析
(a)时间复杂度:我们可以用一颗二叉树描述整个查找过程,n个元素高度为logn,而每次比较过程复杂度都为O(1),所以折半查找时间复杂度为O(logn);
(b)空间复杂度:空间复杂度为O(1)。
相关文章推荐