FC2ブログ
最初
http://blog-imgs-36.fc2.com/a/m/a/amamiyaprog/HeapSort1.txt

修正1

# ヒープソート HeapSort
# 引数 値 (\@Price)
# 戻り値 ヒープソート (@HeapSort)
sub HEAPSORT{
my ($Price) = @_;
my @HeapSort = @$Price;
my $Count = @$Price - 1;

# 配列数の確認
if($Count <= 0){
return 0;
}

# 半順序木 ヒープ構造の作成
for(my $i = 1; $i <= $Count; $i++){
# 配列の位置
my $ParentNum = int(($i - 1) / 2);
my $ChildNum = $i;

while($ChildNum != 0){
# 根に最高値を持って行く
if($HeapSort[$ChildNum] > $HeapSort[$ParentNum]){
($HeapSort[$ChildNum], $HeapSort[$ParentNum]) = ($HeapSort[$ParentNum], $HeapSort[$ChildNum]);
}

# 配列の位置
$ChildNum = $ParentNum;
$ParentNum = int(($ParentNum - 1) / 2);
}
}

# 昇順ソート
for(my $i = $Count; $i > 0; $i--){
# 配列の位置
my $ParentNum = 0;
my $ChildNum = 1;
# 根を後ろに持っていく
($HeapSort[$ParentNum], $HeapSort[$i]) = ($HeapSort[$i], $HeapSort[$ParentNum]);

# ヒープ構造の再構築
while($ChildNum < $i){
# $ChildNumは常に最初は子ノードAを指し示めしている
# 子ノードBがソート済みではない と 子ノードA < 子ノードB ならTrue
$ChildNum++ if((($ChildNum + 1) != $i) && ($HeapSort[$ChildNum] < $HeapSort[$ChildNum + 1]));
# 親のノード < 子ノード
if($HeapSort[$ParentNum] < $HeapSort[$ChildNum]){
($HeapSort[$ParentNum], $HeapSort[$ChildNum]) = ($HeapSort[$ChildNum], $HeapSort[$ParentNum]);
}else {
last;
}

# 配列の位置
$ParentNum = $ChildNum;
$ChildNum = (2 * $ParentNum) + 1;
}
}

return @HeapSort;
}


参考URL
ヒープソート - Wikipedia

修正1
明示的にした
$Child++ if(($Child < ($i - 1)) && ($HeapSort[$Child] < $HeapSort[$Child + 1]));

$ChildNum++ if((($ChildNum + 1) != $i) && ($HeapSort[$ChildNum] < $HeapSort[$ChildNum + 1]));
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

Author:雨宮
Firefoxを使用しているので気づかなかったけど、IE6でソースコードを上手くコピーできない

5/3
携帯用ならIE6でもソースコードをコピーできる
携帯用

検索フォーム


あわせて読みたいブログパーツ
一寸先は闇 RSS