第99回【Python】昇順ソート、降順ソート

Pythonby LeoSaki

現在取り組んでいるのは、paiza ラーニング問題集「C ランクレベルアップメニュー」になります。

学習サービストッププログラミング学習サイト【paizaラーニング】のメインページ。paiza独自のシステムにより、面倒な環境構築が不要、Webブラウザがあれば5秒で学習が開始できます。わかりやすい1本3分の動画と豊富な演習問題で初心者〜中級者のプログラミング学習を支援します。paiza.jp

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 99 回目です。

会社の LeoSaki(旦那)がいる部署は年齢幅が大きいです。中間より上の年齢層のグループと下の年齢層のグループで働き方の考え方に大きな違いを感じます。LeoSaki(旦那)は下の年齢層のグループ寄りな考え方をしながら、やっていることは上の年齢層のグループなんだなぁ。

それでは、今日も頑張ってみようと思います。

昇順ソート

プログラミング練習問題「昇順ソート」問題を解いてスキルアップ!みんなも一緒に解いてみよう!paiza.jp

n 個の数 a_1, … , a_n が与えられます。与えられた数を小さい順に改行区切りで出力してください。

n
a_1
...
a_n

1 行目に正整数 n が、 2 行目から (n + 1) 行目には整数 a_1, …, a_n が改行区切りで与えられます。


すべてのテストケースにおいて、以下の条件をみたします。

・ 1 ≤ n, a_i ≤ 50 (1 ≤ i ≤ n)


入力例

2
4
3

出力例

3
4

これはとても簡単。あぁ、ソート関連は VBA で書くのは面倒なんだった・・・。

Python
N = int(input())
A = [int(input()) for _ in range(N)]
for a in sorted(A):
    print(a)
VBA
Private Sub c_rank_sort_step1()

    N = Cells(1, 1)
    Dim A() As Variant
    ReDim A(N - 1)
    For i = 0 To N - 1
        A(i) = Cells(i + 2, 1)
    Next
    Call QuickSort(A, LBound(A), UBound(A))
    For Each v In A
        Debug.Print v
    Next

End Sub
Private Sub QuickSort(ByRef argAry() As Variant, ByVal lngMin As Long, ByVal lngMax As Long)
 
    Dim i As Long
    Dim j As Long
    Dim vBase As Variant
    Dim vSwap As Variant
    vBase = argAry(Int((lngMin + lngMax) / 2))
    i = lngMin
    j = lngMax
    Do
        Do While argAry(i) < vBase
            i = i + 1
        Loop
        Do While argAry(j) > vBase
            j = j - 1
        Loop
        If i >= j Then Exit Do
        vSwap = argAry(i)
        argAry(i) = argAry(j)
        argAry(j) = vSwap
        i = i + 1
        j = j - 1
    Loop
    If (lngMin < i - 1) Then
        Call QuickSort(argAry, lngMin, i - 1)
    End If
    If (lngMax > j + 1) Then
        Call QuickSort(argAry, j + 1, lngMax)
    End If
     
End Sub

降順ソート

プログラミング練習問題「降順ソート」問題を解いてスキルアップ!みんなも一緒に解いてみよう!paiza.jp

n 個の数 a_1, …, a_n が与えられます。与えられた数を大きい順に改行区切りで出力してください。

n
a_1
...
a_n

1 行目に正整数 n が、 2 行目から (n + 1) 行目には整数 a_1, …, a_n が改行区切りで与えられます。


すべてのテストケースにおいて、以下の条件をみたします。

・ 1 ≤ n, a_i ≤ 50 (1 ≤ i ≤ n)


入力例

2
4
3

出力例

4
3

さっきと逆順にするだけなんだけれど。VBA は相変わらず大変な作業になります。

Python
N = int(input())
A = [int(input()) for _ in range(N)]
for a in sorted(A,reverse=True):
    print(a)
VBA
Private Sub c_rank_sort_step2()

    N = Cells(1, 1)
    Dim A() As Variant
    ReDim A(N - 1)
    For i = 0 To N - 1
        A(i) = Cells(i + 2, 1)
    Next
    Call QuickSort_desc(A, LBound(A), UBound(A))
    For Each v In A
        Debug.Print v
    Next

End Sub
Private Sub QuickSort_desc(ByRef argAry() As Variant, ByVal lngMin As Long, ByVal lngMax As Long)
 
    Dim i As Long
    Dim j As Long
    Dim vBase As Variant
    Dim vSwap As Variant
    vBase = argAry(Int((lngMin + lngMax) / 2))
    i = lngMin
    j = lngMax
    Do
        Do While argAry(i) > vBase
            i = i + 1
        Loop
        Do While argAry(j) < vBase
            j = j - 1
        Loop
        If i >= j Then Exit Do
        vSwap = argAry(i)
        argAry(i) = argAry(j)
        argAry(j) = vSwap
        i = i + 1
        j = j - 1
    Loop
    If (lngMin < i - 1) Then
        Call QuickSort_desc(argAry, lngMin, i - 1)
    End If
    If (lngMax > j + 1) Then
        Call QuickSort_desc(argAry, j + 1, lngMax)
    End If
     
End Sub

最後に

ワークシートを利用する方が VBA っぽいし早いしと思うのだけれど、ワークシートが使えない環境だと長いコードを書く必要がある。すみません。昔々にどこかを参考にして作ったソートのコードです。

ワークシートが使えない環境で VBA 利用するってどんな状況かはちょっとわからない。

引き続き、よろしくお願いいたします!

LeoSaki

旦那の方。 猫と嫁とのキャンプをこよなく愛する。 AWS 6 冠達成者。AWS 好き。 ITパスポート、基本情報技術者、応用情報技術者も取得しています。