複数の条件でクイックソートをソートする方法はありますか? たとえば、エッジのセットがあります。各エッジには、ソース、宛先、および長さがあります。最初に長さの短いエッジを配列に入れたいと思います。しかし、長さが同じ場合は、元の頂点が小さいもので並べ替えたいと思います。これらのソース頂点が同じ場合、2 つの宛先頂点のうち小さい方で並べ替えたいと思います。
例えば:
4 (ソース) 2 (宛先) 3 (長さ)
1 (ソース) 5 (宛先) 3 (長さ)
どちらも同じ長さなので、ソース頂点を見ます。2 番目のエッジは最初のエッジよりも小さいため、ソース頂点で比較するため、それらを交換します。
以下は私のクイックソートで、なぜ正しくソートされないのか正直わかりません.クイックソートの効率を下げて安定させる方法があれば、喜んで提案します!
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