Translate

2008年7月6日日曜日

どう書く?::比較しないソートの作成

どう書く?orgの問題でも解いてみました。
ひとまずこれ。
比較しないソートの作成

ソート対象のデータ同士で一切比較などを行わずにソートし、ソート結果を出力するプログラムを作成してください。条件は以下の通り。
・最低値・最大値・個数・並び替え対象の4つを引数として受け取る
・最大値と最低値はあくまで取りうる可能性であり、実際に出現することを保障するものではない。
・同値が複数出現することがある。
・入出力方法及びフォーマットは自由、関数として実装し引数に渡す形でも良い。
・小数点以下の数値が渡されることはないが、負の数は渡される可能性がある。
・最大値や最低値を元に算出した数値との比較は使用しても問題ありません。
・出来るだけ多様な条件のデータをソートできるアルゴリズムを使ってください(データが多少多いときや一定の並び順だとソート失敗するものはダメ)
・昇順降順はどちらでもかまいません

以下サンプル入出力
>>入力
-1 10 10
-1 9 4 8 9 6 3 9 5 2
>>出力
-1 2 3 4 5 6 8 9 9



ひとまず、バケットソートで解いてみました。
use strict;
use warnings;

my $set_min = -1;
my $set_max = 10;
my @set_num = (-1, 9, 4, 8, 9, 6, 3, 9, 5, 2);


&bucketSort($set_min, $set_max, \@set_num);

sub bucketSort{
my $delta = 1 - shift;
my $delta_max = $delta + shift;
my $ref_num = shift;
my @array;
for (@$ref_num){

($array[$_ + $delta]) ? $array[$_ + $delta]++ : ($array[$_ + $delta] = 1);
}
for (my $i=1; $i<$delta_max; $i++){
if($array[$i]){
my $temp = $i - $delta;
print " $temp"x$array[$i];
}
}
}

実行結果。

0 件のコメント: