📌  相关文章
📜  用于在排序和旋转数组中搜索元素的 Python3 程序(1)

📅  最后修改于: 2023-12-03 15:40:53.567000             🧑  作者: Mango

用于在排序和旋转数组中搜索元素的 Python3 程序

在排序数组中搜索元素很简单,只需使用二分查找算法即可。但是,当数组被旋转后,二分查找就不再适用了。本程序旨在解决在旋转过的有序数组中搜索元素的问题。

程序功能

程序使用二分查找算法,在旋转过的有序数组中查找元素,并返回元素的索引。

程序思路

程序利用二分查找算法的思想,先判断中间元素是否等于目标元素,若等于则返回该元素的索引;若中间元素大于左端元素,则左半段有序且目标元素在左半段,否则右半段有序且目标元素在右半段。根据以上思路,可以按照以下步骤查找目标元素:

  1. 以数组的中间元素为基准,将数组分成左右两部分。
  2. 判断中间元素是否等于目标元素,若等于则返回该元素的索引。
  3. 若中间元素大于左端元素,则左半段有序。
    • 判断目标元素是否在左半段,若是则在左半段中查找,否则在右半段中查找。
  4. 若中间元素小于左端元素,则右半段有序。
    • 判断目标元素是否在右半段,若是则在右半段中查找,否则在左半段中查找。
  5. 重复以上步骤,直到找到目标元素或者查找完整个数组。
代码
def search(nums, target):
    if not nums:
        return -1

    left, right = 0, len(nums) - 1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] == target:
            return mid

        # 左半段有序,注意此处用小于等于号
        if nums[mid] >= nums[left]:
            if nums[left] <= target < nums[mid]:
                right = mid - 1
            else:
                left = mid + 1
        # 右半段有序
        else:
            if nums[mid] < target <= nums[right]:
                left = mid + 1
            else:
                right = mid - 1

    return -1
使用方法

调用 search() 函数,传入旋转过的有序数组和目标元素即可,程序会返回目标元素的索引。若目标元素不在数组中则返回 -1。