このディレクトリの索引

#  データ列中で一番小さい値を探し、1番目の要素と交換する。
#  次に、2番目以降のデータ列から一番小さい値を探し、2番目の要素と交換する。
#  これを、データ列の最後まで繰り返す(厳密には、データ列の最後より1つ手前まで
#  の繰り返しでよい。一つ前まで交換済みであれば、最後(残り)は必ず最大値に
#  なるからである)。大小が入れ替わる降順の場合も同様の手法。
#  実装例 [編集]
#  for(i=0; idata[j])min = j ;
#      swap(data[i],data[min]) ;
#  }
#  動作例 [編集]
#  初期データ: 8 4 3 7 6 5 2 1 
#  太字はソート完了した部分
#  1 4 3 7 6 5 2 8 (1回目のループ終了時)
#  1 2 3 7 6 5 4 8 (2回目のループ終了時)
#  1 2 3 7 6 5 4 8 (3回目のループ終了時)
#  1 2 3 4 6 5 7 8 (4回目のループ終了時)
#  1 2 3 4 5 6 7 8 (5回目のループ終了時)
#  この例では、一見して、この時点で既にソート完了したとわかる。
#  しかしデータが多数の場合はそうはいかないし、アルゴリズムで
#  「一見して」ソート完了か否か判断できない。アルゴリズム通りに最後まで
#  処理する必要がある。
#  1 2 3 4 5 6 7 8 (6回目のループ終了時)
#  1 2 3 4 5 6 7 8 (7回目のループ終了時)

選択ソート([],[]) :- !.
選択ソート([A],[A]) :- !.
選択ソート(L1,[N|R2]) :-
        append(L0,[N|R],L1),
        \+((member(N1,L0),N1 @< N)),
        \+((member(N2,R),N2 @< N)),
        swap(L0,[N|R],R1),
        選択ソート(R1,R2).

swap([],[N|R],R) :- !.
swap(L0,[N|R],R1) :-
        L0=[S|R0],
        append(R0,[S|R],R1).