第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 利用するってどんな状況かはちょっとわからない。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません