高等学校情報科「情報Ⅰ」教員研修用教材(本編)の「第3章 コンピュータとプログラミング」ではPythonが使われています。文科省のPythonはPythonじゃねぇのような酷評がありました。その後,少しだけ改善されましたが,まだまだのところもあります。
この128ページ以降に,探索アルゴリズムの話があります。
線形(逐次)探索:

インデントがスペース5個だったり4個だったりで統一がとれていませんね。PEP 8 で推奨されている演算子のまわりのスペースやコンマの後のスペースもほとんど入っていません。range() の書き方は始値・増分を省略しない方針のようです。
とりあえず PEP 8 に合わせて書き直してみましょう。range() の流儀は悩ましいところですが,ここでは一般的な書き方に直しました。p を x にしたのは特に意味はありません(Python の標準モジュール bisect に合わせました)。
def linsearch(a, x):
for i in range(len(a)):
if a[i] == x:
print("見つかりました")
break
a = [61, 15, 82, 77, 21, 32, 53]
x = 82
linsearch(a, x)
ちなみに,for ループは次のようにするほうが Python らしくなります。研修資料ではこれは教えない方針のようです。
def linsearch(a, x):
for k in a:
if k == x:
print("見つかりました")
break
二分探索:

これもまずは上と同じような方針で整形します。
def binsearch(a, x):
i = 0
j = len(a) - 1
while i <= j:
m = (i + j) // 2
if a[m] == x:
print("見つかりました")
break
elif a[m] > x:
j = m - 1
else:
i = m + 1
これは,等しいか・大きいか・小さいかを毎回調べていることになり,三分探索のような感じです。以上か・未満かで二分するようにしてみましょう:
def binsearch(a, x):
i = 0
j = len(a) - 1
while i < j:
m = (i + j) // 2
if a[m] < x:
i = m + 1
else:
j = m
if a[i] == x:
print("見つかりました")
こちらのほうが比較回数が少ないはずです。
Last modified: