またどう書くに投稿してみた
http://ja.doukaku.org/comment/6809/
かなりこれも恥ずかしい。本に書いてある通りのアルゴリズムではない(というか、本なんか読んでない)ので、テストはしてみたけど、証明済みではない。
-module(sort). -export([main/4]). main(Min, Max, _Num, List) -> sort(Min, Max, List). sort(_Min, _Max, [ ] ) -> [ ] ; sort(_Min, _Max, [H| [ ] ]) -> [H]; sort(Min, Min, List) -> List; sort(Min, Max, List) -> Pivot = Min + ((Max - Min) div 2), sort(Min,Pivot, [ X || X <- List, X < Pivot ]) ++ [ X || X <- List, X =:= Pivot ] ++ sort(Pivot+1, Max, [ X || X <- List, X > Pivot ]).
ちなみにErlangにはlists:sort/1というライブラリ関数がある。
で、テスト用のコードのほうがErlangらしいかも
-module(testsort).
-compile(export_all).
doit(0) -> io:format("test done~n",);
doit(N) ->
Size = random:uniform(N),
{Min, Max, List} = makelist(N,, N),
io:format("Min ~p, Max ~p, Size ~p List ~p~n", [Min, Max, Size, List]),
BIFresult = lists:sort(List),
Myresult = sort:main(Min, Max, Size, List),
if
BIFresult =:= Myresult -> io:format("OK ~p~n",[Myresult]),
doit(N - 1);
true -> io:format("Error: ~p : ~p~n", [BIFresult, Myresult])
end.
makelist(0, L, _N) -> {lists:min(L), lists:max(L),lists:reverse(L)};
makelist(Size, L, N) -> makelist(Size - 1, [random:uniform(N) - (N div 2) | L], N).
こんな風に使う
16> testsort:doit(19). Min -8, Max 10, Size 6 List [-2,-5,-5,-3,-8,-7,4,-4,3,3,10,4,8,-5,-5,10,-3,10,9] OK [-8,-7,-5,-5,-5,-5,-4,-3,-3,-2,3,3,4,4,8,9,10,10,10] Min -8, Max 8, Size 4 List [-8,4,-4,6,6,-3,1,8,-6,4,-2,3,8,3,4,-8,-7,-2] OK [-8,-8,-7,-6,-4,-3,-2,-2,1,3,3,4,4,4,6,6,8,8] Min -7, Max 8, Size 5 List [6,-7,-4,-1,-7,8,-7,-1,3,7,4,-5,0,6,1,-6,0] OK [-7,-7,-7,-6,-5,-4,-1,-1,0,0,1,3,4,6,6,7,8] Min -7, Max 8, Size 1 List [1,-5,6,-7,-4,-4,-5,8,2,3,-3,2,-1,2,-3,4] OK [-7,-5,-5,-4,-4,-3,-3,-1,1,2,2,2,3,4,6,8] Min -6, Max 7, Size 1 List [1,-4,5,4,3,2,1,2,-3,-6,1,0,7,4,5] OK [-6,-4,-3,0,1,1,1,2,2,3,4,4,5,5,7] Min -6, Max 7, Size 4 List [4,7,2,-4,7,-6,2,7,1,2,-3,-6,5,-6] OK [-6,-6,-6,-4,-3,1,2,2,2,4,5,7,7,7] Min -4, Max 7, Size 6 List [5,2,5,6,7,-4,1,-1,-2,5,0,-1,0] OK [-4,-2,-1,-1,0,0,1,2,5,5,5,6,7] Min -5, Max 4, Size 5 List [3,2,-5,-5,3,-2,-2,4,-5,1,-3,-2] OK [-5,-5,-5,-3,-2,-2,-2,1,2,3,3,4] Min -2, Max 6, Size 7 List [2,2,6,3,-1,0,1,-2,6,1,3] OK [-2,-1,0,1,1,2,2,3,3,6,6] Min -4, Max 5, Size 6 List [1,4,3,0,-3,0,5,-3,0,-4] OK [-4,-3,-3,0,0,0,1,3,4,5] Min -2, Max 5, Size 9 List [3,1,-1,-2,5,-1,2,-1,4] OK [-2,-1,-1,-1,1,2,3,4,5] Min -2, Max 4, Size 8 List [4,-2,1,3,2,-1,1,2] OK [-2,-1,1,1,2,2,3,4] Min -1, Max 3, Size 1 List [-1,0,2,-1,0,0,3] OK [-1,-1,0,0,0,2,3] Min -2, Max 2, Size 6 List [-2,-2,2,0,0,-1] OK [-2,-2,-1,0,0,2] Min -1, Max 3, Size 1 List [2,1,2,-1,3] OK [-1,1,2,2,3] Min -1, Max 2, Size 4 List [2,0,-1,-1] OK [-1,-1,0,2] Min 0, Max 0, Size 1 List [0,0,0] OK [0,0,0] Min 1, Max 1, Size 2 List [1,1] OK [1,1] Min 1, Max 1, Size 1 List [1] OK [1] test done ok