有没有办法通过多个条件进行快速排序?例如,我有一组边。每条边都有源、目的地和长度。我想首先将长度较小的边缘放在我的数组中。但如果长度相同,我想用较小的源顶点对其进行排序。如果这些源顶点相同,我想按两个目标顶点中较小的一个进行排序。
例如:
4(源) 2(目的地) 3(长度)
1(源) 5(目的地) 3(长度)
由于它们都具有相同的长度,因此我们查看源顶点。由于第二条边小于第一条边,我们交换它们,因为我们按源顶点进行比较。
下面是我的快速排序,老实说,我不确定为什么它不能正确排序。如果有一种方法可以降低快速排序的效率但更稳定,我很乐意接受建议!
void quickSort(edge *e, int left, int right)
{
int i = left, j = right;
int temp, temp1, temp2;
int pivot = (left + right)/2;
while(i <= j)
{
while(e[i] < e[pivot])
i++;
while(e[pivot] < e[j])
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);
}
我的条件排序:
bool edge::operator<(const edge &other) const
{
if (length < other.length)
return true;
else if ((length == other.length) && (source < other.source))
return true;
else if((length == other.length) && (source == other.source) && (destination < other.destination))
return true;
return false;
}
同样,如果有人知道如何通过降低时间复杂度但使其稳定来正确地进行快速排序,我很乐意接受任何建议!谢谢!有什么帮助吗?
编辑:这就是我调用快速排序的方式。我根据读取的边数调用它。
quickSort(e, 0, edges-1); //-1 because if you put in edges, it'd go past the bounds of the array
编辑:当我尝试在我的算法中加入这样的东西时:
0 1 1
0 3 1
1 3 1
2 5 1
4 10 1
4 8 1
10 8 1
11 6 2
11 7 2
6 7 1
9 6 1
9 7 1
这是输出:
0 1 1
0 3 1
1 3 1
2 5 1
4 8 1
4 10 1
6 7 1
6 9 1
8 10 1 <- 应低于 7 9 1
7 9 1 <- 应该高于 8 10 1
6 11 2
7 11 2