[엑셀 VBA #16] (배열#3) 배열 내림차순/오름차순 정렬하기(버블 정렬)
엑셀 VBA 강의 2015. 12. 3. 18:16 |이전 포스팅 바로가기
[엑셀 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
※주황색 글자로 쓰인 부분이 버블 정렬의 기본 구조입니다.
'엑셀 VBA 강의' 카테고리의 다른 글
[엑셀 VBA #18] 엑셀 매크로로 서식 지정하기(테두리, 폰트, 글자크기 등) (4) | 2015.12.15 |
---|---|
[엑셀 VBA #17] 중복되지 않는 난수 랜덤 추출하기 (0) | 2015.12.05 |
[엑셀 VBA #15] 셀에 특정 값이 입력될때 실행되는 메크로 (2) | 2015.12.01 |
[엑셀 VBA #14] 문자 나누고 합치기 (split, join) (0) | 2015.11.27 |
[엑셀 VBA #13] (배열#2) 배열의 크기 확인 Ubound, Lbound (0) | 2015.11.26 |