이전 포스팅 바로가기

배열 관련 포스팅 바로가기


[엑셀 VBA #16] (배열#3)배열 내림차순/오름차순 정렬

(버블 정렬)




이번 포스팅에서는 배열 내의 값을 내림차순/오름차순으로 정렬하는 법에 대해 배워보겠습니다.




엑셀 VBA로 엑셀의 정렬 기능을 구현하는 방법은 여러가지가 있습니다.


그 중 가장 간단한 버블 정렬에 대해 알아보도록 하겠습니다.


예제를 받고 따라와주세요.





버블 정렬이란?


예를 들어 3 , 4 , 6 , 5  이라는 배열이 있다고 쳐봅시다.


버블 정렬을 위 배열에 사용하게 되면 아래와 같은 프로세스가 진행됩니다. (내림차순 정렬으로 설명하겠습니다.)


1. 배열의 첫 항은 두번째 항보다 작은가? 작다면 두 항 위치를 바꾸고, 그렇지 않다면 그냥 내버려 둔다.

배열 변경 : 4 , 3 , 6 , 5


2. 새로운 배열의 두번째 항은 세번째 항보다 작은가? 작다면 위치를 바꿔주고, 그렇지 않다면 내버려 둔다.

배열 변경 : 4 , 6 , 3 , 5


3. 새로운 배열의 세번째 항은 네번째 항보다 작은가? 작다면 위치를 바꾸고, 그렇지 않다면 움직이지 않는다.

배열 변경 : 4 , 6 , 5 , 3

4. 다시 배열의 첫번째 항은 두번째 항보다 작은가? 작다면..... 그렇지 않다면 .....    (생략하겠습니다.)

배열 변경 : 6 , 4 , 5 , 3


5. 배열의 두번째 항은 세번째 항보다 작은가? ........

배열 변경 : 6 , 5 , 4 , 3


6. 다시 배열의 첫번째 항은 두번째 항보다 작은가? ......

배열 변경 : 6 , 5 , 4 , 3 (변화 없음)


7. 내림차순 배열(6 , 5 , 4 , 3) 완성



버블 정렬은 앞 항과 바로 뒤 항의 비교의 반복입니다.


첫 항부터 시작해서, 마지막 항까지의 비교 및 위치 교체가 완료되면 가장 작은 수는 마지막으로 가게 됩니다.


그 다음엔 마지막 항(가장 작은 수)를 배재하고 나머지 숫자들끼리 비교 및 위치 교체를 진행합니다.


그러면 맨 뒤에 가장 작은 수, 뒤에서 두번째에 두번째로 작은 수가 위치하게 됩니다.


이런 프로세스를 항의 개수만큼 진행하면, 마지막에는 내림차순으로 정렬된 배열을 만들 수 있습니다.






이번 예제는 정렬이 안된 성적을 내림차순으로 정렬하는 예제입니다.





Sub example_11()


Dim score()                '점수 배열 선언

Dim sortemp as integer        '바뀌는 대상을 임시로 저장하는 변수   

Dim maxval As Long            '총 항 개수를 구하기 위한 변수

Dim n As Long                   

Dim m As Long


     maxval = Cells(2, 2).End(4).Row - 1        '점수 총 개수를 구함


   ReDim score(1 To maxval)                '점수의 개수에 맞춰서 배열 재선언

    

    score = Application.Transpose(Cells(2, 2).Resize(maxval, 1).Value)        '값을 score 배열에 집어넣음


'Application.Transpose는 열을 행으로(또는 반대로) 바꿔주는 함수. 1차배열은 우로 나열되기 때문에 위치를 바꿔준다


For n = 1 To UBound(score) - 1        '첫번 째 행부터 몇번 반복되야하는지 설정 총 100개라면 99번 반복

    

    

    For m = 1 To UBound(score) - n            '배열의 개수만큼 반복하는 반복문

        If score(m) < score(m + 1) Then        'm번째 항이 m + 1번째 항보다 작다면

            SortTemp = score(m + 1)            '임시저장변수에 m + 1 항의 값을 넣고

            score(m + 1) = score(m)            'm 항의 값을 m + 1 항에 넣는다

            score(m) = SortTemp                'm 항에는 임시저장변수에 저장되있던 m + 1항의 원래값을 넣는다

'(결국 m과 m + 1 항의 값이 바뀜)

        End If

    

    Next m

    

Next n


Cells(2, 3).Resize(maxval, 1) = Application.Transpose(score)            '옆 열에 정렬된 배열을 삽입.



End Sub



※주황색 글자로 쓰인 부분이 버블 정렬의 기본 구조입니다.







Posted by Simon K
: