二分查找算法的不同实现方式

常见的查找算法

class Find(object):
    """常见的查找算法"""

    def __init__(self):
        pass

    @staticmethod
    def b_search(a_list, target):
        """二分查找算法 非递归实现"""
        low = 0
        high = len(a_list) - 1
        while low <= high:
            mid = low + (high - low) / 2
            if target == a_list[mid]:
                return mid
            if target < a_list[mid]:
                high = mid - 1
            else:
                low = mid + 1
        return -1

    def b_recursion_search(self, a_list, target, low, high):
        """二分查找算法 非递归实现"""
        if low > high:
            return -1
        mid = low + (high - low) / 2
        if target == a_list[mid]:
            return mid
        if target < a_list[mid]:
            return self.b_recursion_search(a_list, target, low, mid - 1)
        else:
            return self.b_recursion_search(a_list, target, mid + 1, high)

    @staticmethod
    def b_first_search(a_list, target):
        """查找第一个等于目标值"""
        low = 0
        high = len(a_list) - 1
        while low <= high:
            mid = low + (high - low) / 2
            if target <= a_list[mid]:
                if target == a_list[mid] and target != a_list[mid - 1]:
                    return mid
                else:
                    high = mid - 1
            else:
                low = mid + 1
        return -1

    @staticmethod
    def b_last_search(a_list, target):
        """查找最后一个等于目标值"""
        low = 0
        high = len(a_list) - 1
        while low <= high:
            mid = low + (high - low) / 2
            if target >= a_list[mid]:
                if target == a_list[mid] and target != a_list[mid + 1]:
                    return mid
                else:
                    low = mid + 1
            else:
                high = mid - 1
        return -1

    @staticmethod
    def b_last_than_search(a_list, target):
        """查找最后一个大于等于目标值"""
        low = 0
        high = len(a_list) - 1
        while low <= high:
            mid = low + (high - low) / 2
            if target <= a_list[mid]:
                if mid == 0 or target > a_list[mid - 1]:
                    return mid
                else:
                    high = mid - 1
            else:
                low = mid + 1
        return -1

    @staticmethod
    def b_last_less_search(a_list, target):
        """查找最后一个小于等于目标值"""
        low = 0
        high = len(a_list) - 1
        while low <= high:
            mid = low + (high - low) / 2
            if target >= a_list[mid]:
                if mid == len(a_list) - 1 or target < a_list[mid + 1]:
                    return mid
                else:
                    low = mid + 1
            else:
                high = mid - 1
        return -1

    @staticmethod
    def sqrt(x):
        """求一个数的算数平方根,精确到小数点后6位"""
        low = 0
        mid = x / 2.0
        high = x
        while abs(mid ** 2 - x) > 0.000001:
            if mid ** 2 < x:
                low = mid
            else:
                high = mid
            mid = (low + high) / 2
        return round(mid, 6)

猜你喜欢

转载自blog.csdn.net/qq_20116223/article/details/110354703
今日推荐