二分查找 go 和 c++ 版本

go 版本

package main

import (
	"errors"
	"fmt"
)

// 二分查找,必须是有序的切片,
// 每次取中间元素 跟 目标对比

func binarySearch(vec []int, target int, left int, right int) (int, error) {
	fmt.Printf("left = %d,right =%d\n", left, right)
	if vec[right] < target {
		return 0, errors.New("slice don't find target")
	}
	// 取中间元素
	//index := left + (right-left)/2
	index := left + (right-left)>>1
	if vec[index] == target {
		return index, nil
	} else if vec[index] > target {
		return binarySearch(vec, target, left, index-1)
	} else {
		return binarySearch(vec, target, index+1, right)
	}
}

func main() {

	vec := []int{2, 31, 42, 78, 102, 197, 1388, 9123}
	num := 9123
	index, err := binarySearch(vec, num, 0, len(vec)-1)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf(" get index = %d\n ", index)
}

输出

get index = 7

C++版本


#include <iostream>
#include <unistd.h>
#include <vector>
#include <ctime>
#include <sys/time.h>
using namespace std;

class solution
{
public:
    static int getPostIndex(vector<int> &vec, int target)
    {
        if (vec.size() <= target)
        {
            return -1;
        }

        for (int left = 0, right = vec.size() - 1; left <= right;)
        {
            int min = ((right - left) >> 1) + left;
            //cout << " min =" << min << endl;
            if (target == vec[min])
            {
                return min;
            }
            else if (target < vec[min])
            {
                right = min - 1;
            }
            else
            {
                left = min + 1;
            }
        }
        return -1;
    }
};

int main()
{
    //test();
    int arr[1000000] = {};
    int len = 1000000;
    for (int i = 0; i < len; i++)
    {
        arr[i] = i + 2;
    }
    vector<int> vec(arr, arr + len );

    int target = 8888;
    int ret = solution::getPostIndex(vec, target);
    cout << "ret = " << ret << endl;
    return 0;
}

输出

ret = 8886

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值