折半查找<二分查找>

折半条件:必须在一个有序数组内进行。

例如:在一个数组中查找一个数,找到就输出该元素下标,如果没找到就输出-1:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int bin_search(int *p,int x, int n)

{

int left = 0;

int right = n - 1;

while (left <= right)

{

int i = 0;

i = ( right-left)/2+left; //(left&right) + ((left^right) >> 1)

//right/2+left/2;

//如果left和right很大,要防止left+right发生溢出

if (p[i] > x)

{

right = i - 1;

}

else if (p[i] < x)

{

left = i + 1;

}

else

return i;

}

return -1;

}

int main()

{

printf( "请输入数组的大小:_" );

int n = 0;

scanf( "%d", &n);

printf( "请输入要查找的元素\n" );

int x = 0;

scanf( "%d", &x);

int *p = (int *)calloc(n, sizeof( int));           //采用动态内存,提高对内存的利用

if (p == NULL)

{

printf( "out of memory\n");

exit(1);

}

printf( "请初始化数组\n" );

for (int i = 0; i < n; i++)

{

scanf( "%d", &p[i]);

}

int ret=bin_search(p,x,n);

printf( "%d\n", ret);

free(p);

system( "pause");

return 0;

}

时间: 2024-10-27 11:49:24

折半查找<二分查找>的相关文章

查找之二折半查找(二分法查找)和插值查找

一.折半查找的前提是线性表中的记录必须好似关键码有序,线性表必须是顺序存储的. 二.折半查找 1 public class Binary_SearchDemo01 { 2 static int[] num = {0,1,3,5}; 3 public static void main(String[] args) { 4 int key = 3; 5 int x = Sequential_Search(key); 6 System.out.println(num[x]); 7 } 8 privat

查找之折半查找

1 #include<stdio.h> 2 #define N 10 3 4 void QuickSort(int a[],int left, int right); 5 int BinSearch(int a[], int low, int high, int key); 6 int main() 7 { 8 int a[N] = {2,8,4,9,7,6,5,3,1,0}; 9 int j = 0, i; 10 QuickSort(a, 0, sizeof(a)/sizeof(a[0])-

选择排序和冒泡排序以及折半查找

1.选择排序 2.冒泡排序 3.折半查找 方式一:开发使用的方法 方式二:普通的折半

【分治】折半查找法

问题 K: [分治]折半查找法 时间限制: 1 Sec  内存限制: 128 MB提交: 17  解决: 9[提交][状态][讨论版] 题目描述 大魔导师培根曾经说过:“读书使人明智,读诗使人聪慧,演算使人精密,哲理使人深刻,伦理学使人有修养,逻辑修辞使人善辩.”由此可见书籍的重要性是不言而喻的.而与书籍天天打交道的图书管理员,更是夺天地之造化,吸日月之精华的“神之职业”.据史料记载,魔法世界从古至今诞生的众多不平凡的人物中,有不少人都曾经做过“图书管理员”,如道家学派创始人老子,威软公司创始人

12月28 数组的几种应用(冒泡、折半查找)

*************数组的应用************* 一.冒泡排序(升序.降序) 1.双层循环(循环套循环) (1).冒泡排序是用双层循环解决.外层循环的是趟数,里层循环的是次数.(2).趟数=n-1:次数=n-趟数.(3).里层循环使用if比较相临的两个数的大小,进行数值交换. 二.折半查找(也叫二分法) 1.前提:数组必须有序. 2.主要就是3个未知量. 顶部:topsub 底部:bottomsub 中间:midsub =(topsub+bottomsub)/2 将数组一分为二,然

java之折半查找

//功能:二分查找import java.util.*; public class Demo1 {    public static void main(String[] args) {      int arr[]={2,5,7,12,25};//定义arr数组并赋值      System.out.print("请输入你需要查找的数:");      Scanner sr=new Scanner(System.in);      int a=sr.nextInt();      B

二分查找/折半查找

二分查找又叫折半查找. 前提:数组是有序的. 思想:1.每次都拿中间的数的key进行比较,如果相等,找到: 2.如果key > 中间数,说明key在中间数的右边,接着拿右边的中间数和key比较: 3.如果key < 中间数,说明key在中间数的左边,接着拿左边的中间数和key比较: 4.循环上述过程: 啥也不说了,上代码: 1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) { 4 5 // 定义数组 6

iOS算法(五)之折半查找

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 折半查找法的两种实现 折半查找法思想: 在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现: 1)     待查找数据值与中间元素值正好相等,则放回中间元素值的索引. 2)     待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值. 3)     待查找数据值

分治法-折半查找和二叉树的相关特性

4.3 折半查找 对于有序数组的查找来说,折半查找是一种性能卓越的算法.它通过比较查找健K和数组中间元素A[m]来完成查找工作.如果它们相等,算法结束.否则,如果K<A[m],就对数组的左半部分执行该操作,如果K>A[m],则对数组的右半部分执行该操作. 折半查找是基于递归思想的,但也可以以迭代方式实现. 代码实现: /** * 折半查找(递归方式实现) * @author xiaofeig * @since 2015.9.16 * @param array 查找的目标数组 * @param

Java实现折半查找(二分法)

利用Java实现折半查找 基本思路:while递归循环,不断判断a[middle]是否等于data,如果等于则跳出循环,返回索引值,如果不等,则进行二分处理,直至两者相等为止:其中通过count计数器记录查找次数,当count次数超过20次时视为元素不存在(此处有待优化) package test; /* * 二分法查找(折半查找) * TGmoving * */ public class halfSearch { public static int HalfSearch(int a[],int