iOS算法(五)之折半查找

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

折半查找法的两种实现

折半查找法思想:

在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现:

1)     待查找数据值与中间元素值正好相等,则放回中间元素值的索引。

2)     待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值。

3)     待查找数据值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,执行1),直到找到相等的值

4)     如果最后找不到相等的值,则返回错误提示信息。

按照二叉树来理解:中间值为二叉树的根,前半部分为左子树,后半部分为右子树。折半查找法的查找次数正好为该值所在的层数。等概率情况下,约为    log2(n+1)-1

代码实现:

#import<Foundation/Foundation.h>

int main(int argc,const char * argv[])

{

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

int count = sizeof(array) / sizeof(array[0]);

int target = 10;

int start = 0, end = count - 1, mid =0;

while (start <= end) {

mid = (start + end) /2;

if (array[mid] > target) {

end = mid -1;

} else if (array[mid] < target) {

start = mid +1;

} else {

break;

}

}

if (start <= end) {

printf("[%d]: %d\n", mid, array[mid]);

} else {

printf("not found\n");

}

return 0;

}

时间: 2024-12-28 08:08:59

iOS算法(五)之折半查找的相关文章

C++算法学习(1)--折半查找(递归和非递归实现)

1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; //折半查找(非递归调用) 6 bool binarySearch(int *arr,int low,int high,int key) 7 { 8 while (low<=high) {//必须为有= 9 int mid = (low + high) / 2; 10 if (arr[mid] > key) { 11 high =

快速排序及折半查找

数据结构与算法---快速排序及折半查找: 1)编程实现数据序列的输入2)实现快速排序算法,并对输入的序列排序后输出: 3)实现折半查找算法,并在步骤(2)排序后的序列上,进行任意地查找,并输出查询结果.(查找成功/不成功:等于关键值的元素个数=1或>1) 1 #include <stdio.h> 2 #define N 100 3 4 //快速排序算法并输出 5 void Quick_Partition(double *r, int i, int j) 6 { 7 double x =

java 二分查找 - 折半查找算法

二分查找: 这个算法是比较简单的,容易理解的.这个算法是对有序的数组进行查找,所以想要使用这个算法那么 首先先要对数组进行排序. 其实有三个指针,开始指针,末尾指针,中间指针,来开始.折半查找. 步骤如下: 1.确定三个指针,start,end,middleIndex. 2.判断start<=end,如果满足,就执行这个方法,不满足,就返回,找不到. 3.在2的前提下,我们对其折半查找,middleIndex = start+end >> 1,取中间值. 4.判断中间位置的值和目标值是否

二分查找/折半查找算法

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功. class Pr

#查找算法#【1】简单查找:顺序、折半查找

•顺序查找 从线性表的一端开始,依次将每个记录的关键字与给定值进行比较,若某个记录的关键字等于给定值,表示查找成功,返回记录序号:若将线性表中所有记录都比较完,仍未找到关键字与给定值相等的记录,则表示查找失败,返回一个失败值. •折半查找 又称为二分查找.这种查找方法要求查找表的数据是线性结构保存,并且还要求查找表中的数据是按关键字由小到大有序排列. 顺序查找比较简单,依次用数组中的每个元素和要查找的元素进行对比即可.不再贴代码说明 折半查找是一种递归过程,每折半一次,可使查找范围缩小一半,当查

算法:顺序查找与折半查找

资料摘自:<数据结构c++语言描述> typedef int DataType; //顺序查找算法 //用顺序查找在n元数组list中查找与key等值的元素,返回该数组元素的下标 //若未找到,则返回-1 int SeqSearch(DataType List[], int n, DataType key) { for(int i = 0; i < n; i++) { if(List[i] == key) { return i; } } return -1; } /* *顺序查找的复杂度

基础算法-查找:折半查找

折半查找 又称为二分查找.这种查找方法要求查找表的数据是线性结构保存,并且还要求查找表中的数据是按关键字由小到大有序排列. 折半查找(二分查找)是一种简单而又高效的查找算法,其查找长度至多为㏒2n+1(判定树的深度),平均查找长度为㏒2(n+1)-1,效率比顺序查找要高,但折半查找只能适用于顺序存储有序表(如对线性链表就无法有效地进行折半查找). 经典非递归算法实现 int Binary_Search(int search_table[], int key, int low ,int high)

查找算法—折半查找

折半查找,又称为二分查找,它的前提是线性表中的记录必须是关键码有序(通常是从大到小),线性表必须采用顺序存储. 算法思想:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功: 若给定值小于中间记录的关键字,则在中间记录的左半区继续查找: 若给定值大于中间记录的关键字,则在中间记录的右半区继续查找. 不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止. 具体代码实现如下: // 用递归实现 int  binarySearch(int[] arr ,int

【算法数据结构Java实现】折半查找

1.背景 以一个题目为例,一个整数x是一组按大小顺序排列好的数列中的一个数,我们要找到x在数列中的索引位置. 比如按从小到大排列的数列: -3,-2,0,4,5,7,12,64 我们要找到数字7的位置,如果是线性查找,时间复杂度是O(n),如果用折半查找的话,时间复杂度是O(log(n)),因为每次折半,计算量少一半,所以取对数. 2.代码 package Algorithm_analysis; public class Bisearch { static int[] array={-3,-2,