挿入ソートとデータ列の関係(後編)
次は、Perlのsort
と対決してみる。
use strict; use warnings; use v5.10; use Time::HiRes qw/time/; use Array::Shuffle qw/shuffle_array/; my @data = 1..100000; say '--- insert (desc) ---'; { my @wk = reverse @data; my $st = time(); my @sorted = insert_sort( @wk ); say time() - $st; } say '--- perl (desc) ---'; { my @wk = reverse @data; my $st = time(); my @sorted = sort { $b <=> $a } @wk; say time() - $st; } say '--- perl (asc) ---'; { my @wk = @data; my $st = time(); my @sorted = sort { $b <=> $a } @wk; say time() - $st; } say '--- perl (random) ---'; for ( 1..5 ) { my @wk = @data; shuffle_array( @wk ); my $st = time(); my @sorted = sort { $b <=> $a } @wk; say time() - $st; } sub insert_sort { my @data = @_; my $cnt = scalar( @data ); for (my $i=1; $i<$cnt; $i++) { my $wk = $data[$i]; my $j = $i; for (; 0<$j; $j--) { if ( $wk <= $data[$j-1] ) { last; } else { $data[$j] = $data[$j-1]; } } $data[$j] = $wk; } return @data; }
結果はこんな感じ。
$ perl aaa.pl
--- insert (desc) ---
0.142155885696411
--- perl (desc) ---
0.00903892517089844
--- perl (asc) ---
0.0095820426940918
--- perl (random) ---
0.0560169219970703
0.05712890625
0.0576529502868652
0.0561912059783936
0.0558931827545166
ちょっとだけ期待したんですけどね、ぜんぜん敵いませんでした。
分かってたとは言え悲しいですが、XSでも書けば違うんですかね。
ただ、sort
にも得意、不得意があるようで、
ランダムデータだと、少し時間が掛かるようです。
あと、こんなの見つけました。
sort-2.01 – perldoc.jp
ちなみに、関数の方の説明はこちら。
sort – perldoc.jp
で、関数の説明を見るとマージソートが使われているそうなので、
マージソートを実装した際にも、
今回のように、データ列との関係を調べてみようと思います。
おしまい。
Leave a Comment