엑셀 VBA/알고리즘

분포에 의한 정렬(엑셀)

GamjaBong 2017. 1. 29. 23:15

[주의사항]

-> 배열의 크기를 정의할 경우 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


[파일]

계수정렬N170129.xlsm

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



계수정렬N170129.xlsm
0.02MB

'엑셀 VBA > 알고리즘' 카테고리의 다른 글

정렬알고리즘(엑셀vba)  (0) 2016.12.17
정렬 알고리즘(엑셀)  (0) 2016.11.20