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

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

はじめに

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

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

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

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

昇順ソート

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

降順ソート

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 利用するってどんな状況かはちょっとわからない。

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

Python学習,Python,paiza

Posted by LeoSaki