查找算法-二分法

1 原理和步骤

有序数组插入和删除操作中,由于所有靠后的数据都需要移动以腾开空间,所以速度较慢。在查找方面,无序数组是通过线性查找,而有序数组可以通过二分法进行快速查找,速度比无序数组快很多。
二分法的时间复杂度为0(log n),具体步骤是先查看数组正中间的数据项,如果那个数据项比要找的大,就要缩小范围,在数组的前半段进行查找;反之则在后半段找。反复这个过程即可。

2完整代码

/**
 * 二分查找
 * 
 * @author JayLai
 * @version 1.0
 * @date 2017年12月29日 12:56
 *
 */
public class binarysearch {

    private int[] arr; // 初始化数组

    /**
     * 构造函数
     */
    public binarysearch(int size) {
        this.arr = new int[size]; // 初始化数组
        for (int i = 0; i < arr.length; i++) { // 录入有序数组
            arr[i] = i;
        }
    }

    public int find(int value) {

        int firstIndex = 0; // 起始下标
        int lastIndex = arr.length - 1; // 末端下标
        int middleIndex = (lastIndex + firstIndex) / 2; // 中间项下标

        while (value != arr[middleIndex]) {

            /*
             * firstIndex <= (firstIndex+ lastIndex)/2 < lastIndex
             */
            if (middleIndex == lastIndex - 1) {
                if (value == arr[lastIndex]) {
                    return lastIndex;
                } else {
                    return -1;
                }
            } else if (value > arr[middleIndex]) { // 目标数据大于数组中间项
                firstIndex = middleIndex;
                middleIndex = (lastIndex + firstIndex) / 2;
            } else { // 目标数据小于数组中间项
                lastIndex = middleIndex;
                middleIndex = (lastIndex + firstIndex) / 2;
            }
        }

        return middleIndex; // 返回查询元素的下标
    }

    public static void main(String[] args) {
        binarysearch search = new binarysearch(100);
        System.out.println(search.find(99));
        System.out.println(search.find(0));
        System.out.println(search.find(200));
    }

}

3 测试结果

这里写图片描述

4 参考文献

[1] Robert, Lafore., Java数据结构和算法.第2版 版. 2004: 中国电力出版社.
[2] Sedgewick Robert与Wayne  Kevin., 算法. 2012: 人民邮电出版社.
以下是Dev-C++实现顺序查找算法二分法查找算法的示例代码: ```c++ #include <iostream> #include <vector> #include <algorithm> using namespace std; // 顺序查找算法 int seqSearch(vector<int>& nums, int target) { for (int i = 0; i < nums.size(); i++) { if (nums[i] == target) { return i; } } return -1; // 查找失败 } // 二分法查找算法 int binarySearch(vector<int>& nums, int target) { int left = 0, right = nums.size() - 1; while (left <= right) { int mid = (left + right) / 2; if (nums[mid] == target) { return mid; } else if (nums[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; // 查找失败 } int main() { vector<int> nums = {3, 5, 2, 8, 4, 7, 1, 6}; sort(nums.begin(), nums.end()); // 二分法查找算法需要有序表 int target = 4; int index1 = seqSearch(nums, target); // 调用顺序查找算法 int index2 = binarySearch(nums, target); // 调用二分法查找算法 if (index1 != -1) { cout << "顺序查找成功,目标元素下标为:" << index1 << endl; } else { cout << "顺序查找失败,未找到目标元素" << endl; } if (index2 != -1) { cout << "二分法查找成功,目标元素下标为:" << index2 << endl; } else { cout << "二分法查找失败,未找到目标元素" << endl; } return 0; } ``` 以上代码中,我们使用了STL中的vector容器来存储顺序表元素,并使用sort函数对其进行排序,以便二分法查找算法能够正确执行。在main函数中,我们分别调用了顺序查找算法二分法查找算法查找目标元素的值为4。最后,根据返回的下标值,输出查找结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值