[주의사항]
-> 배열의 크기를 정의할 경우 A(n)이라고 할 경우 A(0), A(1),----,A(n-1) 처럼 됩니다. 이를 A(n+1)로 정의하여 A(0), A(1),----,A(n) 까지 사용하도록 하였읍니다. A(0)는 사용하지 않음.
-> C언어에서 다음과 같은 구문을 VBA에서 구현하기 위해 다음과 같이 사용하였습니다.
[C언어]
for (j=n; j>=1;j--){
B[N[A[j]]]=A[j]
}
[VBA]
for j= 0 to (n-1)
B[N[A[n-j]]]=A[n-j]
next j
[파일]
1.계수 정렬( Counting Sort)
Dim Data_N As Long
Dim Data_A() As Long
Dim Pt As Long
Sub 데이터()
Dim p As Worksheet
Dim k As Long
Set p = Worksheets("work")
'work sheet에서 데이터의 갯수를 counta함수를 사용하여 확인한다.
Data_N = Application.WorksheetFunction.CountA(p.Rows(6))
'data_n() 정렬하려는 배열의 크기를 재정의 한다.
ReDim Data_A(Data_N + 1)
'work sheet에서 정렬하려는 데이터를 불러와 data_a()에 입력한다.
For k = 1 To Data_N
Data_A(k) = p.Cells(6, k + 1)
Next k
End Sub
Sub CountSort()
Dim k As Long
Dim n() As Long, i As Long, j As Long
Dim B() As Long
Call 데이터
'출력내용 지우기
Application.Range(Rows(8), Rows(13)).Clear
'키 배열에서 제일 큰 수를 키배열의 크기로 잡는다.
i = Application.WorksheetFunction.Max(Data_A)
'키 배열 크기 재정의
ReDim n(i + 1)
'정렬 결과를 입력할 배열의 크기를 재정의 한다.
ReDim B(Data_N + 1)
'각 키의 초기화
For k = 1 To i
n(k) = 0
Next k
'각 키의 개수
For k = 1 To Data_N
n(Data_A(k)) = n(Data_A(k)) + 1
Next k
'출력 초기위치
Pt = 8
Call 출력(n(), i, "N")
'키의 누적합
For k = 2 To i
n(k) = n(k) + n(k - 1)
Next k
For k = 0 To (Data_N - 1)
B(n(Data_A(Data_N - k))) = Data_A(Data_N - k)
n(Data_A(Data_N - k)) = n(Data_A(Data_N - k)) - 1
Next k
Call 출력(B(), Data_N, "B")
End Sub
Sub 출력(a() As Long, n As Long, s As String)
Dim p As Worksheet
Dim k As Long
Set p = Worksheets("work")
p.Cells(Pt + 1, 1) = s
For k = 1 To n
p.Cells(Pt, k + 1) = k
p.Cells(Pt + 1, k + 1) = a(k)
Next k
Pt = Pt + 4
End Sub
'엑셀 VBA > 알고리즘' 카테고리의 다른 글
정렬알고리즘(엑셀vba) (0) | 2016.12.17 |
---|---|
정렬 알고리즘(엑셀) (0) | 2016.11.20 |