phr826 发表于 2022-4-18 21:14:50

二分查找c语言表述怎么写

鱼油们,我最近学了二分查找的概念,不过不会用c语言写出来,可不可以帮帮忙

傻眼貓咪 发表于 2022-4-18 22:32:23

#include <stdio.h>

// 二分查找
int binarySearch(int arr[], size_t n, int elem) {
        int L = 0, R = n - 1, m; // L 和 R 为左右边界,m 为中间位置
        while (L <= R) {
                m = (L + R) >> 1;
                if (arr < elem) {
                        L = m + 1;
                }
                else if (arr > elem) {
                        R = m - 1;
                }
                else {
                        return m;
                }
        }
        return -1;
}

int main() {
        int arr[] = { 13, 5, 24, 86, 14, 55, 63, 70, 1, 32 };
        size_t n = sizeof(arr) / sizeof(int); // 数组长度
        int x = 63;
        printf("%d 在数组里的第 %d 位置", x, binarySearch(arr, n, x));
        return 0;
}63 在数组里的第 6 位置

jhq999 发表于 2022-4-18 22:41:52

傻眼貓咪 发表于 2022-4-18 22:32


先排序,不排序
int arr[] = { 13, 5, 24,14, 86, 55, 63, 70, 1, 32 };
出错

傻眼貓咪 发表于 2022-4-18 23:16:52

jhq999 发表于 2022-4-18 22:41
先排序,不排序
int arr[] = { 13, 5, 24,14, 86, 55, 63, 70, 1, 32 };
出错

这是查找法,不是排序法,二分查找主要是查找其元素对应的位置,如果排序了,就不是原本的位置了

jhq999 发表于 2022-4-19 06:42:07

傻眼貓咪 发表于 2022-4-18 23:16
这是查找法,不是排序法,二分查找主要是查找其元素对应的位置,如果排序了,就不是原本的位置了

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

傻眼貓咪 发表于 2022-4-19 07:52:58

本帖最后由 傻眼貓咪 于 2022-4-19 07:59 编辑

jhq999 发表于 2022-4-19 06:42
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;其缺点是要求待 ...

哈哈,好像也是,认真想,确实不排序如何比较大小?感谢兄弟指教。这么简单的道理,现在才发现,我真是傻了{:10_250:}

真的做多了,往往忽略了最简单,最基本的东西

傻眼貓咪 发表于 2022-4-19 07:59:01

jhq999 发表于 2022-4-19 06:42
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;其缺点是要求待 ...

所以二分查找只适用于有序数组查找吧。
页: [1]
查看完整版本: 二分查找c语言表述怎么写