二分查找的两种实现方法

一、方法1

/*
    求有序(字典序)数组arr的与给定字符串v相同的元素的最大下标。
 */
//
//  main.c
//  排序查找法2
//  Created by LongMa on 15/8/26.
#include 
#include 
#define len (7)
#define width (4)
int main(int argc, const char * argv[])
{
    int l = 0;
    int h = len - 1;
    int m = 0;
    int res = 1;
//    int flag = 0;
    char arr[len][width] = {"ab","ab","abc","bcd","bv","bv","int"};
    char *v = "ab";
    
    //一直找,直到剩下相邻下标的俩个数
    while (l < h - 1)
    {
        m = l + (h - l) / 2;
        res = strcmp(arr[m],v);
        if (res <= 0)//不能用 >= , 如果求与v相同元素的最小下标,用if(res >= 0) h = m; else l = m; 注意看清位置的调换
        {
            l  = m;
        }else
        {
            h = m;
        }
    }
    
    //为何没第一时间把解决点放在这尼?哎,还是思维不够清晰,按画图一步步分析,多演绎是可以发现的啊!不要偷懒!光靠思考,不易发现规律!
    //先判断下标大得那一个是否与v相同
    if (!strcmp(arr[h], v))
    {
        printf("与v相同的元素最大下标为%d",h);
    }else if(!strcmp(arr[l], v))
    {
        printf("与v相同的元素最大下标为%d",l );
    }else
    {
        printf("没有与v相同的元素!");
    }
    return 0;
}

ps:多文件开发写法

//
//  main.c
//  排序查找法2
//  Created by LongMa on 15/8/26.
#include 

#include "二分.h"
int main(int argc, const char * argv[])
{
    
    char arr[len][width] = {"ab","ab","abc","bcd","bv","bv","int"};
    char *v = "int";
    int res = erFenSort(arr, v);
    printf("%d",res);
   
    return 0;
}

//
//  二分.c
#include "二分.h"
int erFenSort(char (*arr)[width],char* v)
{
    int l = 0;
    int h = len - 1;
    int m = 0;
    //一直找,直到剩下相邻下标的俩个数
    while (l < h - 1)
    {
        m = l + (h - l) / 2;
        if (strcmp(arr[m],v) <= 0)//不能用 >= , 如果求与v相同元素的最小下标,用if(res >= 0) h = m; else l = m; 注意看清位置的调换
        {
            l  = m;
        }else
        {
            h = m;
        }
    }
    
    //为何没第一时间把解决点放在这尼?哎,还是思维不够清晰,按画图一步步分析,多演绎是可以发现的啊!不要偷懒!光靠思考,不易发现规律!
    //先判断下标大得那一个是否与v相同
    if (!strcmp(arr[h], v))
    {
        return h;
    }else if(!strcmp(arr[l], v))
    {
        return l;
    }else
    {
        return -1;
    }
}

//
//  二分.h
#ifndef __interesting_procedure______
#define __interesting_procedure______

#include 
#include 
#define len (7)
#define width (4)
int erFenSort(char (*arr)[width],char* v);
#endif /* defined(__interesting_procedure______) */


 
     


二、方法2

/*
    求有序(字典序)数组arr的与给定字符串v相同的元素的最大下标。
 */

#include 
#include 
#define len 7
#define width (4)

int main(int argc, const char * argv[])//写一个二分查找,留个错误。醉了!5个时有关循环条件的!可见:条件判断很重要!
{
    int l = 0;
    int h = len - 1;//不是len
    int m = 0;
    int flag = 0;
    char arr[len][width] = {"ab","ab","abc","bcd","bv","bv","int"};
    char *v = "int";
    while (l <= h)// 不是 <,循环难点就在 开始条件、循环条件、 结束条件!
    {
        m = l + (h - l) / 2;//防止用(l + h)时溢出
        if (strcmp(arr[m], v) > 0)
        {
            h = m - 1;
        }else if (strcmp(arr[m], v) < 0)
        {
            l = m + 1;
        }else
        {
            flag = 1;
            while (!strcmp(arr[m + 1], v))//不是m哦!是判断m位的下一位!
            {
                m++;
//                flag = 1;//不能放在这!放此循环体外!汗,要是下一位不等于v这个就不会执行!
            }
            break;//不是在上面循环里!
        }
    }
    if (1 == flag)
    {
        printf("最大下标为%d",m );
    }else
    {
        printf("没有与v相同的元素");
    }
    return 0;
}


你可能感兴趣的:(二分查找的两种实现方法)