挿入ソートとデータ列の関係(後編)
次は、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