何度目かのmergesortのお勉強
今度は同マージソート
my @b; sub merge_sort { my ($a, $low, $high) = @_; $low //= 0; $high //= @$a -1; my ($i, $j, $k); return if $low >= $high; my $mid = int( ($low + $high) / 2 ); merge_sort($a, $low, $mid); merge_sort($a, $mid+1, $high); for ($i = $low; $i <= $mid; $i++) { $b[$i] = $a->[$i]; } for ($i = $mid+1, $j = $high; $i <= $high; $i++, $j--) { $b[$i] = $a->[$j]; } $i = $low; $j = $high; for ($k = $low; $k <= $high; $k++) { if ($b[$i] <= $b[$j]) { $a->[$k] = $b[$i++]; } else { $a->[$k] = $b[$j--]; } } } sub main { my @a = (10, 2, 34, 11, 13, 5, 55); merge_sort(\@a); print join(',', @a), $/; } main() unless caller;
b = [] def p(a): print ",".join([ str(x) for x in a]) def merge_sort(a, low, high): global b if len(b) == 0: b = [ 0 for i in range(0,len(a)) ] if low >= high: return mid = int( (low+high) / 2 ) merge_sort(a, low, mid) merge_sort(a, mid+1, high) i = low while i <= mid: b[i] = a[i] i += 1 i = mid + 1 j = high while i <= high: b[i] = a[j] i += 1 j -= 1 i = k = low j = high while k <= high: if b[i] <= b[j]: a[k] = b[i] i = i + 1 else: a[k] = b[j] j = j - 1 k = k + 1 def main(): a = [10, 2, 34, 11, 13, 5, 55, 5]; merge_sort( a, 0, 7 ) p(a) if __name__ == '__main__': main()
var b = []; function merge_sort(a, low, high) { if (low >= high) { return } var mid = Math.floor( (low + high) / 2 ); merge_sort(a, low, mid); merge_sort(a, mid+1, high); var i; for (i = low; i <= mid; i++) { b[i] = a[i]; } for (i = mid+1, j = high; i <= high; i++, j--) { b[i] = a[j]; } i = low; j = high; for (k = low; k <= high; k++) { if (b[i] <= b[j]) { a[k] = b[i++]; } else { a[k] = b[j--]; } } } function main() { var a = [10, 2, 34, 11, 13, 5, 55]; merge_sort(a, 0, 6); console.log("%s", a.join(',') ); } main();
元のコードはCなのだけどPerl,JavaScriptはほぼそのままって感じで書き換えられたけどPythonはちょっと違ったので慣れないのもあって危うくPythonが嫌いになりそうなくらい苦労した。