搜索几乎排序的数组的最快方法

时间:2019-08-12 13:34:51

标签: c++ algorithm sorting search

我找不到解决此问题的正确算法。给出了一个几乎排序的数组,例如5 12 15 17 20 2 4(请注意,数组按升序排列直到一个点,然后以下数字小于数组的第一个),我需要说一下元素{{ 1}}是否存在于该数组中。最简单的方法是按升序对整个数组进行排序,但必须更快地完成。 我尝试将x元素与第一个数字和数组的中间x进行比较,然后如果(1+n)/2大于第一个数字并且小于我使用二进制搜索的中间数字从1到中间。这个作品。但是我的问题是,x是否出现在数组的另一半(从中间到n)中,我无法弄清楚。

x

但是我不知道另一半该怎么做,因为第二半中的中间值可能小于左数和右数。

#include <iostream>

int main() {

    int n, i, v[50001], k, x;
    int left, mid, right;

    std::cin >> n;
    for (i = 1; i <= n; i++)
        std::cin >> v[i];
    std::cin >> k;
    while (k) {
        std::cin >> x;
        k--;
        left = 1;
        right = n;
        mid = (left + right) / 2;

        // this part of the code works when the number is between v[1] and v[mid]

        if(v[mid] == x) 
            std::cout << x << " is found\n";
        if (v[left] <= x && v[mid] >= x) {
            right = mid;
            while (left < right) {
                mid = (left + right) / 2;
                if (v[mid] < x)
                    left = mid + 1;
                else
                    right = mid;
            }
            if (v[right] == x)
                std::cout << x << " is found\n";

            else
                std::cout << x << " is not found\n";
        }

0 个答案:

没有答案