このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1305867431/838
#  [1] 授業単元:アルゴリズム  
#  [2] 問題文(含コード&リンク):  
#  「整列アルゴリズムの効率性の比較」  
#  ファイル名:file007.dat //(仮)   
#  を整列対象データとする。  
#  上記のデータを配列に格納し、下記4種の整列アルゴリズムを用いて整列する。  
#  このとき移動回数および実行時間(clock関数)を記録する。  
#     (1) 単純挿入法  
#     (2) 単純選択法  
#     (3) バブルソート  
#     (4) クイックソート  
#   
#  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

単純挿入法([],[]) :- !.
単純挿入法([A|R1],L) :-
        単純挿入法(R1,L1),
        単純挿入法(A,L1,L).

単純挿入法(A,[],[A]) :- !.
単純挿入法(A,[B|R],[A,B|R]) :-
        A @=< B,!.
単純挿入法(A,[B|R1],[B|R2]) :-
        単純挿入法(A,R1,R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

単純挿入法([A|R],L2) :-
        単純挿入法(L1,[],L2).

単純挿入法([],L,L) :- !.
単純挿入法([A|R1],L2,L) :-
        単純挿入(A,L2,L3),
        単純挿入法(R1,L3,L).

単純挿入(A,L1,L) :-
        append(L0,[B|R],L1),
        A @=< B,
        append(L0,[A,B|R],L),!.
単純挿入(A,L1,L) :-
        append(L1,[A],L).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

単純選択法([],[]) :- !.
単純選択法([A],[A]) :- !.
単純選択法(L1,[A|R]) :-
        append(L0,[A|R0],L1),
        append(L0,R0,L2),
        min(L2,B),
        B @>= A,
        単純選択法(L2,R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

バブルソート(_対象ならび,_整列済みならび) :-
        交換(_対象ならび,_対象ならびの一),!,
        バブルソート(_対象ならびの一,_整列済みならび).
バブルソート(_整列済みならび,_整列済みならび).

交換([],[]) :- !,fail.
交換([A,B|R],[B,A|R]) :-
        A @> B,!.
交換([A|R1],[A|R2]) :-
        交換(R1,R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

クイックソート([],[]).
クイックソート([A|R1],L) :-
        分割(A,R1,_Aに等しいか小さいならび,_Aより大きいならび),
        クイックソート(_Aに等しいか小さいならび,L1),
        クイックソート(_Aより大きいならび,L2),
        append(L1,[A|L2],L).

分割(_,[],[],[]) :- !.
分割(A,[B|R],[B|_Aに等しいか小さいならび],_Aより大きいならび) :-
        B @=< A,
        分割(A,R,_Aに等しいか小さいならび,_Aより大きいならび).
分割(A,[B|R],_Aに等しいか小さいならび,[B|_Aより大きいならび]) :-
        B @> A,
        分割(A,R,_Aに等しいか小さいならび,_Aより大きいならび).