C++ 程序问题找不到

    #include<iostream>
 #include<ctime>
 #include<random>
 using namespace std;
 template<typename T>
 void Sort(T *a, T n)    
 {
    bool ft = false;
    for (size_t len = n; len > 1 && !ft; --len)
    {
        size_t Max = 0;
        ft = true;
        for (size_t i = 1; i != len; ++i)
        {
            if (a[Max] <= a[i])
            {
                Max = i;
            }
            else
                ft = false;
        }
        swap(a[Max], a[len - 1]);
    }
}
 template<typename T>
 size_t Serach(T *a, T n, const T&x)
 {
    size_t right = n - 1;
    size_t left = 0;
    while (left<=right) 
    {
        size_t len = (right + left) / 2;
        if (a[len] == x)
            return len;
        if (a[len] > x)
            right = len - 1;
        else
            left = len + 1;
    }
    return -1;
}
 template<typename T>
 size_t rach(T *a, T n, const T&x)
{
    size_t i;
    for (i = 0; i != n && a[i] != x; ++i);
    if (i != n)
        return i;
    return -1;
}
int main() 
{
    constexpr size_t len = 1000;
    size_t a[len],setp=10;
    default_random_engine e(time(0));
    double Clock = static_cast<double>(CLOCKS_PER_SEC) / len;
    for (size_t n = 10; n != len; n += setp)
    {
        long sum = 0;
        clock_t startTime = clock();
        uniform_int_distribution<size_t> u(0, n);
        do 
        {
            ++sum;
            for (size_t i = 0; i != n; ++i)
                a[i] = n - i;
            Sort(a, n);
 #define NDEBUG
 #ifndef NDEBUG
            rach(a, n, u(e));
 #endif
            Serach(a, n, u(e));
        } while (clock() - startTime < 100);    
    
        double elispce = (clock() - startTime) / Clock;
        cout << "数组大小 " << n << " 循环次数 " << sum << " 循环时间 " << elispce << endl;
        cout << "平均循环时间 " << elispce / sum << endl;
        if (n == 100)
            setp = 100;
    }
    system("pause");
    return 0;
 }

我要是单步走不会出问题,
不调试直接运行if (a[len] == x)这一段就是报错
找不到问题,哪个大佬看看

阅读 1.5k
1 个回答

提问程序问题的时候,提供程序的时候

  1. 不要用图片
  2. 程序要能复现的你的问题
  3. 描述你的问题,遇到的具体错误是什么,报错是报什么错,如果可能提供你见的原始编译器错误输出或运行时错误
  4. 程序尽可能简短。在保证可以复现问题的情况下,尽可能删除无关的部分。
    (在这个过程中你很可能自己发现问题)
  5. 程序要完整,可以直接编译运行。

=====================================
你这个问题,在于 leftright 都是 size_t ,这个是一个无符号整数类型。对无符号整形,0 - 1 会得到一个非常打的数值。

len 是 0 的时候,right = len - 1 会变得非常大。然后下一轮循环,len = (left + right) /2 ,依然很大,再访问 a[len] 就出界了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题