c++ - Quicksort 中相等值的比较

标签 c++ algorithm 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);

如果长度相等,有人知道如何/在何处执行顶点排序吗?谢谢!

最佳答案

最好为 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是对当前枢轴元素的引用。如果它实际上是当前数据透视表的整数索引,则需要将其替换为 e[pivot] .


单独说明:您可能想使用 std::swap(e[i],e[j]);而不是冗长(且容易出错)的 get 和 set 语句序列以及临时变量。

关于c++ - Quicksort 中相等值的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13356749/

相关文章:

java - 如何将cocos2d ValueMap作为HashMap发送给Java?

c++ - 将图像缓冲区转换为文件流

java - 从递归方法中删除输入

javascript - 这个 QuickSort 实现有什么问题?

c++ - 在某些情况下,我的快速排序实现失败

c++ - 在构建二叉树时尝试创建指向父节点的指针

algorithm - 二叉树上的预序遍历和深度优先搜索一样吗?

c++ - 在二维数组中查找图形的边界

algorithm - 关于快速排序 killer

c++ - VC 2008 fatal error C1047 cplus 修复了吗?