ロジカ式logo

はじめての
Python

ページ一覧に戻る
応用問題9 並べ替え
問題1
  •   配列の要素が次のようになっているとき、一番左端の要素とそれより右にある要素を順番に比べて、もし右側の要素が左端の要素より小さければ交換して最終的に一番左に最小値が来るようにしてください。
  • my_list=[8, 3, 5, 1, 7]
    表示:並べ替える前 [8, 3, 5, 1, 7]
       並べ替えた後 [1, 8, 5, 3, 7]
ロボた

この図のように考えてみよう!

順番に比べるためにはfor文を使えばいいね!

ロボち
交換図
PRACTICE
my_list = [8, 3, 5, 1, 7]

📖 解答例と解説

my_list = [8, 3, 5, 1, 7]
n = 5

#並び替える前のリスト表示
print("並べ替える前", my_list)

#比較して交換
for j in range(1, n, 1):
    if my_list[0] > my_list[j]:
        temp = my_list[0]
        my_list[0] = my_list[j]
        my_list[j] = temp

#並び替えた後のリストの表示
print("並べ替えた後", my_list)
ロボた

my_list[0]と比べていくのは要素の1から4までだね。

for文で順番に比較交換を繰り返すんだね。これは、あとででてくる選択ソートの基本的な考え方だね。

ロボち

問題2
  •   配列の要素が次のようになっているとき、右端から始めて隣り合う要素を順番に比べて、もし右側の要素が左側の要素より小さければ交換して、最終的に一番左に最小値が来るようにしてください。
  • my_list=[8, 3, 5, 1, 7]
    表示:並べ替える前 [8, 3, 5, 1, 7]
       並べ替えた後 [1, 8, 3, 5, 7]
ロボた

この図のように考えてみてね!

これも順番に比べるためにはfor文を使うといいね!

ロボち
交換図
PRACTICE

📖 解答例と解説

a = [8, 3, 5, 1, 7]
n = 5
print('整列前')
for i in range(0, n, 1):
    print(a[i], end = '')
for j in range(n - 2, -1, -1):
        if a[j] > a[j + 1]:
            temp = a[j]
            a[j] = a[j + 1]
            a[j + 1] = temp
print()
print('整列後')
for i in range(0, n, 1):
    print(a[i], end = '')
ロボた

最初は右端とその隣を比べるところから始めるんだね。右から左へ行くために要素の番号は小さくなっていくんだね。だから間隔は-1というわけなんだね。

最後に添字0と1を比べるのだけれど、range(開始,終了,間隔)では終了の部分の数字は含まないので0を最後の添字にしたいときは終了を-1にしないといけないのだね。

ロボち
ロボた

この問題は、あとででてくるバブルソートの考え方のもとになる考え方だよ!