Quicksort中等值的比较

时间:2012-11-13 07:06:38

标签: c++ algorithm quicksort

我有一个包含三个变量的对象:源顶点,目标顶点和长度。我有一个Quicksort算法,按其长度对对象进行排序。但是,我想要它,以便如果我比较两个对象并且它们的长度相等,那么我的快速排序将使用较小的源顶点在具有较大源顶点的源顶点之前对较小的源顶点进行排序。如果它们也相等,我想比较目标顶点。我想用较小的源顶点对较大的目标顶点进行排序。这将全部在一个数组中完成。以下是我对quicksort的实现。请注意,e [i]是我的对象,它保存我的顶点和长度。

void quickSort(edge *e, int left, int right)
{
  int i = left, j = right;
  int temp, temp1, temp2;
  while(i <= j)
  {
    while(e[i].getLength() < pivot)
      i++;
    while(e[j].getLength() > pivot)
      j--;
    if(i <= j)
    {
      temp = e[i].getLength();
      temp1 = e[i].getEdgeSrc();
      temp2 = e[i].getEdgeDes();
      e[i].setLength(e[j].getLength());
      e[i].setEdgeSrc(e[j].getEdgeSrc());
      e[i].setEdgeDes(e[j].getEdgeDes());
      e[j].setLength(temp);
      e[j].setEdgeSrc(temp1);
      e[j].setEdgeDes(temp2);
      i++;
      j--;
    } //if statement
  }///while loop
  if(left < j)
    quickSort(e, left, j);
  if(i < right)
    quickSort(e, i, right);

}

如果长度相等,可能有人知道如何/在哪里执行顶点排序?谢谢!

2 个答案:

答案 0 :(得分:2)

最好为执行所需操作的edge对象定义比较运算符:

class edge
{
  /* ... */
public:

  bool operator<(const edge &other) const
  {
     /* Length is first criterion: */
     if (length < other.length)
        return true;
     /* Source vertex is second criterion: */
     else if ((length == other.length) && (src < other.src))
        return true;
     return false;
  }

  /* ... */
};

然后,在快速排序实现中,您可以使用此运算符来比较edge个对象,而不是直接访问getLength()等。

while(e[i].getLength() < pivot)
  i++;

变为

while(e[i] < pivot)
  i++;

while(e[j].getLength() > pivot)
  j--;

变为

while(pivot < e[j])
  j--;

请注意,我只定义了operator<,而不是operator>,所以我建议只使用它。或者,您也可以定义operator>

请注意,上面我假设pivot是对当前pivot元素的引用。如果它实际上是当前数据透视的整数索引,则需要将其替换为e[pivot]


单独注意:您可能希望使用std::swap(e[i],e[j]);而不是get-和set-statement以及临时变量的长(且容易出错)序列。

答案 1 :(得分:0)

您需要创建一个比较函数并调用它而不是比较长度。您没有在代码中的任何位置定义pivot,但我认为它与getLength()返回的类型相同。您需要更改pivot以使其成为索引。然后,你写:

while (compareEdge(e[i], e[pivot]) < 0)
    i++;
while (compareEdge(e[j], e[pivot]) > 0)
    j--;

您的compareEdge函数会比较长度。如果它们相等,那么它会按照你描述的那样比较顶点。