快速排序中相等值的比较
Posted
技术标签:
【中文标题】快速排序中相等值的比较【英文标题】:Comparison of equal values in Quicksort 【发布时间】:2012-11-13 07:06:38 【问题描述】:我有一个对象,其中包含三个变量:源顶点、目标顶点和长度。我有一个快速排序算法,可以按对象的长度对对象进行排序。但是,我想要这样,如果我比较两个对象并且它们的长度相等,那么我的快速排序会将具有较小源顶点的对象排在具有较大源顶点的对象之前。如果它们也相等,我想比较目标顶点。我想用较小的源顶点对较大的目标顶点进行排序。这一切都将在一个数组中完成。下面是我的快速排序实现。请注意, 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);
如果长度相等,可能有人知道如何/在哪里执行顶点排序?谢谢!
【问题讨论】:
【参考方案1】:最好为 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 语句序列以及临时变量。
【讨论】:
【参考方案2】:您需要创建一个比较函数并调用它,而不是比较长度。您没有在代码中的任何地方定义pivot
,但我认为它与getLength()
返回的类型相同。您将需要更改 pivot
使其成为索引。然后,你写:
while (compareEdge(e[i], e[pivot]) < 0)
i++;
while (compareEdge(e[j], e[pivot]) > 0)
j--;
您的compareEdge
函数会比较长度。如果它们相等,则它会按照您的描述比较顶点。
【讨论】:
以上是关于快速排序中相等值的比较的主要内容,如果未能解决你的问题,请参考以下文章