# 改良挿入ソート シェルソート Shell Sort # 引数 値 (\@Price) # 戻り値 シェルソート (@ShellSort) sub SHELLSORT{ my ($Price) = @_; my @ShellSort = @$Price; my @h = (1); my $Count = @$Price - 1; # 配列数の確認 if($Count < 0){ return 0; } # 間隔 for(my $i = 0; $h[$i] < @$Price; $i++){ $h[$i + 1] = (3 * $h[$i]) + 1; } # 昇順ソート for(my $i = (@h - 2); $i >= 0; $i--){ my $Gap = $h[$i]; for(my $j = 0; $j + $Gap <= $Count; $j++){ for(my $k = ($j + $Gap); $k > 0; $k--){ if($ShellSort[$k - $Gap] > $ShellSort[$k]){ # 改良挿入ソート シェルソート Shell Sort ($ShellSort[$k], $ShellSort[$k - $Gap]) = ($ShellSort[$k - $Gap], $ShellSort[$k]); }else { last; } } } } return @ShellSort; }