このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/347
#  [1] 授業単元:整列処理 
#  [2] 問題文(含コード&リンク): http://codepad.org/afHWYPLF 
#  問題が3問あります。長いので問題文もリンク先に書かせていただきました。  
#  
#  
#  
#  【問題2】
#  クイックソート法の特性を調べたい。同一の数列について、クイックソートプログラムの実行中に行われる
#  (1)比較の回数、(2)交換の回数を計数し、次にバブルソートプログラムの実行中に行われる
#  (1)比較の回数、(2)交換の回数を計数して比較せよ。また、バブルソート法よりクイックソート法の方が
#  比較と交換の回数が少ない理由を考察せよ。ただし、数列はrand関数を用いて生成せよ。データの個数が、
#  20個、40個、60個、80個、100個の5つの場合について、比較と交換の回数を計数する。
#  
#     計数結果の出力形式
#     <クイックソート法>
#      データ数:20個
#      比較回数:xxxx回
#      交換回数:xxxx回
#  
#      データ数:40個
#      比較回数:xxxx回
#      交換回数:xxxx回
#       ・
#       ・
#       ・
#       ・
#     <バブルソート法>
#      データ数:20個
#      比較回数:xxxx回
#      交換回数:xxxx回
#  
#      データ数:40個
#      比較回数:xxxx回
#      交換回数:xxxx回
#       ・
#       ・
#       ・
#       ・
#  
#  レポートには以下のものを添付する事。
#  (1)回数を計数するプログラムを加えたバブルソートプログラムと、それを実行するmain関数のプログラムリスト
#  (2)回数を計数するプログラムを加えたクイックソートプログラムと、それを実行するmain関数のプログラムリスト
#  (3)出力形式に基づいた両プログラムの計数結果
#  (4)バブルソート法よりクイックソート法の比較、交換の回数が少ない理由
#  
#  rand関数の使用例
#  #include
#  #include
#  int main(void)
#  {
#      int i,n,ran,sum;
#      srand(time(NULL));
#      printf("Number of trials:");
#      scanf("%d",&n);
#      sum=0;
#      for(i=0;i= B,
        分割(A,R1,LP_1,LP_2,_比較回数2,_移動回数2),
        _比較回数1 is _比較回数2 + 1,
        _移動回数1 is _移動回数2 + 1,!.
分割(A,[B|R1],LP_1,[B|LP_2],_比較回数1,_移動回数1) :-
        A @< B,
        分割(A,R1,LP_1,LP_2,_比較回数2,_移動回数2),
        _比較回数1 is _比較回数2 + 2,
        _移動回数1 is _移動回数2 + 1,!.

結合([],Y,Y,1,1) :- !.
結合([U|X],Y,[U|Z],_比較回数,_移動回数1) :-
        結合(X,Y,Z,_比較回数,_移動回数2),
        _移動回数1 is _移動回数2 + 1,!.

'バブルソートの比較・移動回数'(_対象ならび,_整列済みならび,_比較回数,_交換回数) :-
        交換(_対象ならび,_対象ならびの一,_比較回数1,_交換回数1),!,
        バブルソート(_対象ならびの一,_整列済みならび,_比較回数2,_交換回数2),
        _比較回数 is _比較回数1 + _比較回数2,
        _交換回数 is _交換回数1 + _交換回数2,!.
'バブルソートの比較・移動回数'(_整列済みならび,_整列済みならび,_比較回数,0) :-
        length(_整列済みならび,_比較回数),!.

交換([A,B|R],[B,A|R],1,1) :-
       A @> B,!.
交換([A|R1],[A|R2],_比較回数1,_交換回数) :-
        交換(R1,R2,_比較回数2,_交換回数),
        _比較回数1 is _比較回数2 + 2,!.
交換([],[],_,_) :- !,fail.