web-dev-qa-db-ja.com

リンクリストをJava

リンクリストをソートするためのバブルソートアルゴリズムを作成しました。私はJava初心者で、データ構造を学習しようとしています。2番目の要素が正しくソートされていない理由がわかりません。

[〜#〜]編集[〜#〜]

class SListNode {
  Object item;
  SListNode next;


  SListNode(Object obj) {
    item = obj;
    next = null;
  }


  SListNode(Object obj, SListNode next) {
    item = obj;
    this.next = next;
  }

}
public class SList {

    private SListNode head;
    private SListNode temp;

    public void sortList() {
        SListNode node = head,i,j;
        head = node;
        i = node;
        j = node.next;
        while(i.next != null) {
            while(j.next != null) {
                if((Integer)i.item < (Integer)j.item) {
                    temp = i.next;
                    i.next = j.next;
                    j.next = temp;
                 }
                j = j.next;
            }
            i = i.next;
        }
    }
}

これは私が得ている出力です

List after construction: [  3  6  9  4  12  15  ]
After sorting: [  3  4  9  12  6  15  ]

私はバブルソートの最悪のシナリオがO(n2)。リンクリストでマージソートを使用して、時間計算量を増やすことはできますか?

ありがとう!

13
user525146

リンクリストで機能する多くのソートアルゴリズムがあり、この場合、マージソートはうまく機能します。私はリンクリストの並べ替えに関する質問への以前の回答を書きました。これは、リンクリストの多くの古典的な並べ替えアルゴリズムとその時間と空間の複雑さ。リンクリストでは、挿入ソート、選択ソート、マージソート、クイックソートを使用できます。少し手を加えることで、ヒープソートを機能させることもできます。私の古い答えには、これを行う方法の詳細があります。

コードに関しては、内側のループで、jポインタがnextになるまでnullを進めていることに注意してください。この時点では、jを他の値にリセットすることはないため、外側のループが今後繰り返されるたびに、内側のループが実行されることはありません。おそらく、各反復の開始時にj = i.nextを設定する必要があります。さらに、j.nextがnullの場合はループを停止したくない場合がありますが、jがnullの場合は、配列の最後の要素をスキップするためです。

さらに、ここで記述したソートアルゴリズムは、多くのパスを作成しているため、バブルソートではなく選択ソートです。リンクリスト上で、まだ配置していない最小の要素を探します。これが問題かどうかはわかりませんが、あなたがこれを知っているかどうかはわかりませんでした。とは言うものの、ほとんどの場合、バブルソートは選択ソートよりも効率が悪いので、それはおそらく良いことだと思います(リストがすでにソートに近づいている場合を除く)。

お役に立てれば!

7
templatetypedef