二分探索(binarySearch)を10種類の言語で書いてみた
何故書くか?は前前前回書いたので、以下、即本題。
実行環境は今までと同じく、coding groundを使用。
本当は定義したメソッドだけ書いておきたいのだけど、後々動作確認したいと思った時にコピペで済むので前処理等も書いておいた。
JavaScript
function binarySearch(arr, target) {
let head = 0,
mid,
tail = arr.length;
while(head <= tail){
mid = Math.floor((head + tail) / 2);
if (arr[mid] === target) {
return mid;
} else if(arr[mid] < target) {
head = mid + 1;
} else {
tail = mid -1;
}
}
return -1;
}
console.log(binarySearch([104, 150, 165, 304, 354, 413, 541, 865], 304));
PHP
function binarySearch($arr, $target) {
$head = 0;
$tail = count($arr) - 1 ;
while ($head <= $tail) {
$mid = floor(($head + $tail) / 2);
if ($arr[$mid] === $target) {
return $mid;
} else if ($arr[$mid] < $target) {
$head = $mid + 1;
} else {
$tail = $mid -1;
}
}
return -1;
}
echo (binarySearch([104, 150, 165, 304, 354, 413, 541, 865], 304));
Perl
use POSIX qw(floor);
my @arr = (104, 150, 165, 304, 354, 413, 541, 865);
my $result = &binarySearch(\@arr, 304);
print $result;
sub binarySearch {
my ($arr, $target) = @_;
my $head = 0;
my $mid;
my $tail = $#arr;
while ($head <= $tail) {
$mid = floor(($head + $tail) / 2);
if ($arr[$mid] == $target) {
return $mid;
} elsif ($arr[$mid] < $target) {
$head = $mid + 1;
} else {
$tail = $mid - 1;
}
}
return -1;
}
Python
import math
def binarySearch(arr, target):
head = 0
tail = len(arr) - 1
while head <= tail:
mid = math.floor((head + tail) / 2)
if arr[mid] == target:
return mid
elif arr[mid] < target:
head = mid + 1
else:
tail = mid - 1
return False
print(binarySearch([104, 150, 165, 304, 354, 413, 541, 865], 304))
Ruby
def binarySearch(arr, target)
head = 0
tail = arr.size - 1
while head <= tail do
mid = ((head + tail) / 2).floor
if arr[mid] == target
return mid
elsif arr[mid] < target
head = mid + 1;
else
tail = mid -1;
end
end
return -1
end
print binarySearch([104, 150, 165, 304, 354, 413, 541, 865], 304)
Go
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println(binarySearch([]int{104, 150, 165, 304, 354, 413, 541, 865}, 304));
}
func binarySearch(arr []int, target int) int {
head := 0;
tail := len(arr) - 1;
for head <= tail {
mid := int(math.Floor(float64(head + tail) / 2));
if arr[mid] == target {
return mid;
} else if arr[mid] < target {
head = mid + 1;
} else {
tail = mid - 1;
}
}
return -1;
}
Kotlin
func binarySearch(arr: [Int], target: Int) -> Int {
var head = 0
var mid = 0
var tail = arr.count - 1;
while head <= tail {
mid = Int(floor(Double(head + tail) / 2))
if arr[mid] == target {
return mid;
} else if arr[mid] < target {
head = mid + 1;
} else {
tail = mid - 1;
}
}
return -1;
}
print(binarySearch(arr: [104, 150, 165, 304, 354, 413, 541, 865], target: 304))
Swift
fun main(args: Array<String>) {
println(binarySearch(arrayOf(104, 150, 165, 304, 354, 413, 541, 865), 304));
}
fun binarySearch(arr: Array<Int>, target: Int): Int {
var head = 0
var tail = arr.size-1
while (head <= tail) {
var mid = Math.floor((head + tail).toDouble() / 2).toInt()
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
head = mid + 1;
} else {
tail = mid - 1;
}
}
return -1;
}
C
using System.IO;
using System;
class Program
{
static void Main()
{
int[] arr = { 104, 150, 165, 304, 354, 413, 541, 865 };
Console.WriteLine(binarySearch(arr, 304));
}
static int binarySearch(int[] arr, int target) {
int head = 0;
int tail = arr.Length - 1;
while (head <= tail) {
int mid = (int)Math.Floor((double)(head + tail) / 2);
if (arr[mid] == target) {
return mid;
} else if(arr[mid] < target) {
head = mid + 1;
} else {
tail = mid - 1;
}
}
return -1;
}
}
C
#include <stdio.h>
#include <math.h>
int binarySearch(int arr[], int len, int target) {
int head = 0;
int tail = len - 1;
while (head <= tail) {
double tmp = (head + tail) / 2;
int mid = (int) floor(tmp);
if(arr[mid] == target) {
return mid;
} else if(arr[mid] < target) {
head = mid + 1;
} else {
tail = mid - 1;
}
}
return -1;
}
int main() {
int arr[] = {104, 150, 165, 304, 354, 413, 541, 865};
printf("%d", binarySearch(arr, 8, 304));
return 0;
}