C语言二分查找

#include <stdio.h>

/*
二分查找条件: 1、有序序列  2、数据在数组中
*/

int baseBinarySearch(int a[],int h,int k)
{
    int low=0;
    int high=h;
    int mid =0;
    int NoFound = -1;
    while (low <= high)
    {
        mid = low + (high-low) /2 ;
        if ( k < a[mid] )
        {
            high = mid - 1;
        }
        else if ( k > a[mid] )
        {
            low = mid + 1;
        }
        else
        {
            return mid;
        }
    }
    return NoFound;
}

//查找第一个相等的元素
int FirstElementBinSearch(int a[],int h,int k)
{
    int low=0;
    int high=h;
    int mid =0;
    int NoFound = -1;
    while (low <= high)
    {
        mid = low + (high-low) /2 ;
        if ( k <= a[mid] )
        {
            high = mid - 1;
        }
        else
        {
            low = mid + 1;
        }
    }
    return low <= h ? low : NoFound;
}

//查找最后一个相等的元素low

int LastElementBinSearch(int a[],int h,int k)
{
    int low=0;
    int high=h;
    int mid =0;
    int NoFound = -1;
    while (low <= high)
    {
        mid = low + (high-low) /2 ;
        if ( k >= a[mid] )
        {
           low = mid + 1 ;
        }
        else
        {
            high = mid -1 ;
        }
    }
    printf("%d %d %d\n",low,high,a[low-1]);

    if (low - 1 >= 0 && a[low - 1] ==k)
    {
        return low-1;
    }
    return NoFound;
}

原文地址:https://www.cnblogs.com/flashBoxer/p/9471527.html

时间: 2024-08-05 23:34:56

C语言二分查找的相关文章

C语言二分查找与冒泡排序

今天数据结构上机课,老师给了我们几个上个学期做过的C语言题,我惊讶的发现,之前会的算法,时间久了就忘记了,很尴尬,这也充分说明了 我C语言学习功底不够扎实.所以,在课后,我认认真真重新推了一遍,希望下次不会忘记了. 1 #include<stdio.h> 2 main() 3 { 4 int a[]={2,4,6,8,10,12,14,16,18,20}; 5 int left,right,mid,b;//定义变量 6 printf("请输入b的值:"); 7 scanf(

(经典) K&amp;R的名著&lt;&lt;C程序设计语言&gt;&gt;二分查找

#include<stdio.h> //查找成功则返回所在下标否则返回-1 int binsearch(int A[], int n,int a) { int low, high, mid; low = 0; high = n -1; while ( low <= high) { /// 这里必须是 <= mid = (low+high) / 2; if (A[mid] == a) return mid; else if(A[mid]<a) low = mid +1; els

用C语言实现二分查找算法

二分查找算法思想非常简单,就是折半查找一个有序序列,在这里,我用二分查找一个顺序排列的整形数组.若用C实现的话我们需要注意以下几个方面: 1.如何判断查找完成,定义返回值含义,定义退出循环条件 2.如何处理边界问题,例如1 2 3 这个序列,当我们要查找1或者3时,会不会使程序出现BUG 3.对于数列来说,我们通常用整形存储其下标,二分查找若取下标中间数,则会出现什么样的问题?这些问题是否会影响我们的查找,若有问题,则应该如何规避? 通常情况,作为一个初学者,我甚至觉得二分查找过于简单,不值一提

C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)

C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆) 虽然直接插入排序,冒泡排序以及二分查找是算法中最为基础以及老掉牙的话题,但作为一名算法的深爱者,有时候无聊时候总会将这些简单的话题重新理解并敲写一番,目的只是为了得到理解娴熟的程度.而且,我觉得越是简单基础的东西,有时候更应该反复的去敲写,深化它,并最终让其中的思想内化为自己的一部分.待到他日一提起之时,会相当娴熟的"刷刷刷..."几分钟搞定,那就很有成就感了! 因为我喜欢对于一个问题进行实例的剖析,进而再转化为特有的用某种

选择排序、冒泡排序、快速排序和二分查找的C语言实现

1 #include <stdio.h> 2 3 #define ASC 0 //升序,从左到右,从小到大 4 #define DESC 1 //降序,从左到右,从大到小 5 #define TRUE 1 //布尔值,真 6 #define FALSE 0 //布尔值,假 7 8 typedef int datatype; //定义数组元素的类型,这里暂定为int 9 10 void selectSort(datatype array_to_sort[], int length, int mo

深入浅出数据结构C语言版(12)——从二分查找到二叉树

在很多有关数据结构和算法的书籍或文章中,作者往往是介绍完了什么是树后就直入主题的谈什么是二叉树balabala的.但我今天决定不按这个套路来.我个人觉得,一个东西或者说一种技术存在总该有一定的道理,不是能解决某个问题,就是能改善解决某个问题的效率.如果能够先了解到存在的问题以及已存在的解决办法的不足,那么学习新的知识就更容易接受,也更容易理解. 万幸的是,二叉树的讲解是可以按照上述顺序来进行的.那么,今天在我们讨论二叉树之前,我们先来讨论一种情形.一种操作:假设现在有一个数组,数组中的数据按照某

用c语言编写二分查找法

二分法的适用范围为有序数列,这方面很有局限性. #include<stdio.h> //二分查找法 void binary_search(int a[],int start,int mid,int end); int main() { int iLength,istars,i,iTimes,iNumber,n; int a[100]; printf("please enter the length of the array:\n "); scanf("%d&quo

一起talk C栗子吧(第二十五回:C语言实例-二分查找)

各位看官们,大家好,上一回中咱们说的是顺序查找的例子,这一回咱们说的例子是:二分查找.闲话休 提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中说了查找的相关内容,并且介绍了一种查找方法:顺序查找.大家还记得吗?台 下有看官说:记得呢.我刚想表扬一下这位看官,但是话还没有出口,这看官就又说了:就是不知道哪个 人最后找到钥匙没有...我什么表扬的话也没有说,大声吆喝道:"这一回中,我给大家介绍一种新的查 找方法:二分查找法.或者叫折半查找法也可以." 在介绍二分查找法之

C语言练习题1(关于快速排序,二分查找与运行时间)

刚刚完成师兄给的一道题目: 随机生成10000位数,进行快速排序后,用二分查找法定位到某个要查询的数(键盘输入某个要查询的数),  结果输出查询的时间,以及是否查到 分享下自己的解题思路: 1,要懂得如何随机生成数 2,要了解快速排序以及二分法思想 3,要直到如何测试出程序运行时间 下面是自己写的代码,欢迎各位提出宝贵的意见以及见解,小生感激不尽 1 /* 2 本代码描述: 3 4 随机生成10000位数,进行快速排序后, 5 用二分查找法定位到某个要查询的数 6 (键盘输入某个要查询的数),