• 【算法】二分查找


    最近在牛客网刷题,有一道题目是实现二分查找算法,由此便在咖啡店写了段代码,实现这个简单的算法。但同时自己还有一个问题(见最后),希望有朋友能帮忙解答。后期如果自己知道答案,我会自己更新在此。

    一. 算法介绍

       优点:比较次数少,查找速度快,平均性能好;

       缺点:要求待查表为有序表,且插入删除困难。

       适用:不经常变动而查找频繁的有序列表。

       时间复杂度:o(log(n))

    二. 算法代码实现(C++)   

     1 // BinarySearch.cpp : Defines the entry point for the console application.
     2 
     3 #include "stdafx.h"
     4 #include <iostream>
     5 
     6 using namespace std;
     7 
     8 //compare function
     9 int compare(const void *val1, const void *val2)
    10 {
    11     int iVal1 = *(int*)val1;
    12     int iVal2 = *(int*)val2;
    13 
    14     cout << "Compare: " << iVal1 << ", " << iVal2 << endl;
    15 
    16     if (iVal1 > iVal2)
    17     {
    18         return 1;
    19     }
    20     else if (iVal1 == iVal2)
    21     {
    22         return 0;
    23     }
    24     else
    25     {
    26         return -1;
    27     }
    28 }
    29 
    30 //nel: num of element,  every element size
    31 void *bsearch(const void *key, const void *base, size_t nel, size_t width, int (*compar)(const void*, const void *))
    32 {
    33     int pos = nel / 2;
    34 
    35     cout << "Position: " << pos << endl;
    36 
    37     int result = (*compar)(key, (int *)base + pos);
    38 
    39     if (pos == 0)
    40     {
    41         return result == 0 ? (void *)base : NULL;
    42     }
    43 
    44     if (result > 0)
    45     {
    46         return bsearch(key, (int *)base + pos + 1, pos, width, compar);
    47     }
    48     else if (result == 0)
    49     {
    50         return (void *)base;
    51     }
    52     else
    53     {
    54         return bsearch(key, base, pos, width, compar);
    55     }
    56 }
    57 
    58 int _tmain(int argc, _TCHAR* argv[])
    59 {
    60     int array[] = { 1, 3, 5, 6, 11, 13, 17, 29, 44, 66, 79, 99, 111 };
    61     int arrayNum = sizeof(array) / sizeof(*array);
    62     cout << "Array Element Num: " << arrayNum << endl;
    63     
    64     int searchVal = 13;
    65     cout << "Search Value: " << searchVal << endl;
    66 
    67     int *result = (int *)bsearch(&searchVal, array, arrayNum, sizeof(*array), compare);
    68     
    69     cout << "Result: " << (result == NULL ? "Not Found" : "Found") << endl;
    70     
    71     system("pause");
    72     return 0;
    73 }

    运行显示正确。

    三. 问题

       这里自己有一个小问题,就是算法接口中的size_t width参数我并没有用到,同时我假设元素都是INT型。请问这里该如何修改,既能用到width,又不用假设元素为特定类型?谢谢。

    Best Regards

    Kevin Song

  • 相关阅读:
    Writing Custom Providers
    terraform 几个方便的工具
    几张简单的terraform flow 图——可以快速了解terraform的使用
    Stateful Kubernetes Applications Made Easier: PSO and FlashBlade
    使用k8s && minio 进行 postgres 数据库自动备份
    Understanding how uid and gid work in Docker containers
    nightwatchjs 基于nodejs&& webdriver 协议的自动化测试&&持续集成框架
    hasura graphql-engine graphql2chartjs 方便的graphql 转换chartjs 的类库
    nginx unit 1.8 支持基于java servlet 的开发模型
    试用 openresty/lua-resty-shell
  • 原文地址:https://www.cnblogs.com/KevinSong/p/4188534.html
Copyright © 2020-2023  润新知