【问题标题】:Built in function for searching sorted array in C用于在 C 中搜索排序数组的内置函数
【发布时间】:2018-04-29 11:03:30
【问题描述】:

C 中是否有内置函数用于搜索已排序的整数数组?

我可以轻松实现它,但它似乎很常见 - 如果没有库/内置 C 函数会很奇怪。

【问题讨论】:

    标签: c sorting search


    【解决方案1】:

    stdlib.h实际上包含一些排序和搜索功能。 qsort 将让您对数组进行就地排序,bsearch 将为您对排序后的数组执行二进制搜索。在这两种情况下,您都必须提供比较功能。

    【讨论】:

      【解决方案2】:

      在有序数组https://www.tutorialspoint.com/c_standard_library/c_function_bsearch.htm中有二分查找bsearch()

      例子:

      #include <stdio.h>
      #include <stdlib.h>
      
      
      int cmp_int(const void *pa, const void *pb) { 
          int a = *(int *)pa; 
          int b = *(int *)pb; 
          return (a > b) - (a < b); 
      }
      
      int values[] = { 5, 20, 29, 32, 63 };
      
      int main () {
          int *item;
          int key = 32;
      
          /* using bsearch() to find value 32 in the array */
          item = (int*) bsearch (&key, values, 5, sizeof (int), cmpfunc);
          if( item != NULL ) {
              printf("Found item = %d\n", *item);
          } else {
              printf("Item = %d could not be found\n", *item);
          }
      
          return(0);
      }
      

      UPD @jonathan-leffler 添加了适当的比较器

      【讨论】:

      • 此解决方案适用于“普通”整数值,但请注意:当减法导致整数溢出时,它可能具有未定义的行为。
      • @paddy 只是复制粘贴示例。随意提供适当的比较器功能。
      • 适当的整数比较器通过以下机制避免溢出:int cmp_int(const void *pa, const void *pb) { int a = *(int *)pa; int b = *(int *)pb; return (a &gt; b) - (a &lt; b); } 如果a 大于b,则返回+1,如果小于则返回-1,如果它们小于则返回0'重新平等。
      【解决方案3】:

      您需要bsearch,此链接将带您进入手册以及该手册中提供的示例。或者,您可以在 linux 框中键入

      man -a bsearch
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多