#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)这一段就是报错
找不到问题,哪个大佬看看
提问程序问题的时候,提供程序的时候
(在这个过程中你很可能自己发现问题)
=====================================
你这个问题,在于
left
跟right
都是size_t
,这个是一个无符号整数类型。对无符号整形,0 - 1 会得到一个非常打的数值。当
len
是 0 的时候,right = len - 1
会变得非常大。然后下一轮循环,len = (left + right) /2
,依然很大,再访问a[len]
就出界了。