基本的に、リンクされたリストの最初のアイテムを取得し、最初のアイテムより大きいか等しいアイテムを持つリストと、最初のアイテムより小さいアイテムを持つリストの 2 つの別々のリストにソートするピボット ソート アルゴリズムを作成する必要があります。すでにソートされているサイズ 1 のリンクされたリストに到達するまで、それらを再帰的に並べ替えます。次に、より小さいリストとより大きいリストをマージして、ソートされたリストを形成します。
私のアルゴリズムは無限ループの最後の項目でスタックし続けており、約 23 時間睡眠をとっていないため、間違いを犯した場所を見つけるために新鮮な目が必要です。もしあなたが助けてくれたら、私はとても助かります。
Linked list クラスは単純で、2 つの項目があります。1 つ目は単なる正の整数で、2 つ目はもちろんリスト内の次の項目です。コードは、最後のアイテムにヒットしたときに Sort() 関数に引っ掛かり、最後のアイテムを一緒に追加しません。
public class PivotSort {
public static void main(String[] args) {
try {
intList x = intList.CreateFromUserInput(); // just makes a linked list
// from numbers I type in
x = Sort(x);
x.PrintList();
} catch (Exception e) {
System.out.println(e);
}
}
public static intList Sort(intList list) {
if (list == null || list.item == null)
return list;
return Append(Sort(Part_Less(list.item, list)),
Sort(Part_Greater(list.item, list)));
}
public static intList Part_Less(int N, intList L1) {
if (L1 == null)
return null;
if (L1.item < N)
return new intList(L1.item, Part_Less(N, L1.next));
else
return Part_Less(N, L1.next);
}
public static intList Part_Greater(int N, intList L1) {
if (L1 == null)
return null;
if (L1.item >= N)
return new intList(L1.item, Part_Greater(N, L1.next));
else
return Part_Greater(N, L1.next);
}
public static intList Append(intList L1, intList L2) {
try {
if (L1 == null)
return L2;
if (L2 == null)
return L1;
for (intList curr = L1; curr != null; curr = curr.next) {
if (curr.next == null) {
curr.next = L2;
break;
}
}
return L1;
} catch (Exception e) {
System.out.println(e);
return null;
}
}
}