-1
int choose_pivot(int lo, int hi){
   int mid = ((hi-lo)/2)+1;
   if((arr[hi]<arr[lo])^(arr[hi]<arr[mid])){
      return hi;
   }
   else if((arr[lo]<arr[hi])^(arr[lo]<arr[mid])){
      return lo;
   }
   else{
      return mid;
   }
}

此函数应按如下方式选择枢轴。考虑给定数组的第一个、中间和最后一个元素。(如果数组的长度为奇数,应该清楚“中间”元素是什么;对于偶数长度为 2k 的数组,使用第 k 个元素作为“中间”元素。确定这三个元素中的哪一个是中值。返回它的价值。

这个函数有什么问题不能让它发挥它的作用吗?我是否错过了一些函数没有给出预期结果的情况?

4

3 回答 3

1

如果您尝试从 coursera.org 解决任务,则需要使用

int mid = ((hi-lo)/2);
于 2013-02-06T10:37:06.307 回答
1

有一件事我认为是致命错误:没有关于前置条件的文档。特别是,是否lo == hi合法地调用它。(如果它是合法的,则代码具有未定义的行为。) 并且lo代表hi 什么?在我发现工作得很好的通常的 C++ 约定下,lo它将是包容性和hi排他性的。但同样,你没有告诉我们,尽管知道我们是否要判断代码的正确性很重要。(你这样做的事实arr[hi]让我觉得你已经采用了一些不寻常的惯例,即两端都包容。)

!=没有这些信息,除了进行风格评论(例如,使用而不是^比较结果,使用returnwith?:而不是if ... else if ... else等)之外,就不可能做任何事情。

于 2013-02-06T10:48:05.490 回答
0
  1. 您可能应该使用!=而不是^比较不等式的布尔结果。

  2. 根据文字描述,您应该返回arr[hi]而不是hi(和类似的mid, lo)。

于 2013-02-06T10:33:01.883 回答