函数来选择用于快速排序的枢轴

Function to choose a pivot for quick sort

本文关键字:快速排序 用于 选择 函数      更新时间:2023-10-16
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个元素作为"中间"元件。确定这三个元素中的哪一个是中值。返回其值。

这个函数有什么问题吗?它可能不让它做它应该做的事情?我是否遗漏了一些函数不能给出所需结果的情况?

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

int mid = ((hi-lo)/2);

有一件事我认为是致命的错误:没有关于先决条件的文件。特别地,是否使用lo == hi合法来调用它。(如果合法代码具有未定义的行为。(lohi是什么代表在通常的C++约定下,我觉得这很有效很好,lo将是包容性的,而hi是排他性的。但是再说一遍,你没有告诉我们,尽管这很重要知道我们是否要判断代码的正确性。(你做arr[hi]的事实让我觉得你已经收养了把两端都包含在内的有点不同寻常的惯例。(

没有这些信息,除了进行风格评论(例如使用!=而不是^比较结果,使用return?:而不是if ... else if ... else等(。

  1. 您可能应该使用!=而不是^来比较不等式的布尔结果。

  2. 根据文本描述,应该返回arr[hi]而不是hi(类似于midlo(。