2023. 4. 12. 15:34ㆍVB.NET/왕초보
VB.NET에서 정렬 알고리즘을 구현하는 방법은 매우 중요한 주제입니다. 이 글에서는 VB.NET에서 사용 가능한 몇 가지 대표적인 정렬 알고리즘에 대해 살펴보고, 각 알고리즘의 구현 방법과 성능에 대해서도 자세히 다룰 것입니다.
1. 버블 정렬(Bubble Sort)
버블 정렬은 가장 간단한 정렬 알고리즘 중 하나입니다. 이 알고리즘은 인접한 두 개의 요소를 비교하고, 만약 두 개의 요소가 잘못된 순서로 되어 있으면 위치를 교환하는 과정을 반복합니다. 이 과정을 모든 요소에 대해 반복하면 정렬이 완료됩니다. 하지만 버블 정렬은 시간 복잡도가 O(n^2)이라는 단점이 있어서 속도가 느리다는 단점이 있습니다.
Sub BubbleSort(ByVal arr() As Integer)
Dim i, j, temp As Integer
For i = 0 To arr.Length - 2
For j = 0 To arr.Length - 2 - i
If arr(j) > arr(j + 1) Then
temp = arr(j + 1)
arr(j + 1) = arr(j)
arr(j) = temp
End If
Next
Next
End Sub
2. 선택 정렬(Selection Sort)
선택 정렬은 가장 작은 값을 찾아서 맨 앞에 놓고, 그 다음으로 작은 값을 찾아서 두 번째 자리에 놓는 방식으로 정렬하는 알고리즘입니다. 선택 정렬도 버블 정렬과 마찬가지로 시간 복잡도가 O(n^2)입니다.
Sub SelectionSort(ByVal arr() As Integer)
Dim i, j, min, temp As Integer
For i = 0 To arr.Length - 2
min = i
For j = i + 1 To arr.Length - 1
If arr(j) < arr(min) Then
min = j
End If
Next
If min <> i Then
temp = arr(i)
arr(i) = arr(min)
arr(min) = temp
End If
Next
End Sub
3. 삽입 정렬(Insertion Sort)
삽입 정렬은 각 요소를 적절한 위치에 삽입하면서 정렬하는 알고리즘입니다. 삽입 정렬은 버블 정렬과 선택 정렬보다는 약간 더 빠르며, 최선의 경우 시간 복잡도는 O(n)이지만, 평균적으로는 O(n^2)입니다.
Sub InsertionSort(ByVal arr() As Integer)
Dim i, j, key As Integer
For i = 1 To arr.Length - 1
key = arr(i)
j = i - 1
While j >= 0 AndAlso arr(j) > key
arr(j + 1) = arr(j)
j -= 1
End While
arr(j + 1) = key
Next
End Sub
4. 퀵 정렬(Quick Sort)
퀵 정렬은 분할 정복(Divide and Conquer) 방식을 사용하여 정렬하는 알고리즘 중 하나입니다. 배열을 분할하여 각 부분 배열을 정렬한 다음, 이를 병합하여 전체 배열을 정렬합니다. 퀵 정렬은 평균적으로는 O(nlogn)의 시간 복잡도를 가지며, 최악의 경우 O(n^2)의 시간 복잡도를 가집니다.
Sub QuickSort(ByVal arr() As Integer, ByVal low As Integer, ByVal high As Integer)
If low < high Then
Dim pivot As Integer = Partition(arr, low, high)
QuickSort(arr, low, pivot - 1)
QuickSort(arr, pivot + 1, high)
End If
End Sub
Function Partition(ByVal arr() As Integer, ByVal low As Integer, ByVal high As Integer) As Integer
Dim pivot As Integer = arr(high)
Dim i As Integer = low - 1
Dim j As Integer
For j = low To high - 1
If arr(j) <= pivot Then
i += 1
Swap(arr(i), arr(j))
End If
Next
Swap(arr(i + 1), arr(high))
Return i + 1
End Function
Sub Swap(ByRef a As Integer, ByRef b As Integer)
Dim temp As Integer = a
a = b
b = temp
End Sub
5. 병합 정렬(Merge Sort)
병합 정렬은 분할 정복(Divide and Conquer) 방식을 사용하여 정렬하는 알고리즘 중 하나입니다. 배열을 반으로 나누어 각 부분 배열을 정렬한 다음, 이를 병합하여 전체 배열을 정렬합니다. 병합 정렬은 항상 O(nlogn)의 시간 복잡도를 가집니다.
Sub MergeSort(ByVal arr() As Integer, ByVal left As Integer, ByVal right As Integer)
If left < right Then
Dim mid As Integer = (left + right) \ 2
MergeSort(arr, left, mid)
MergeSort(arr, mid + 1, right)
Merge(arr, left, mid, right)
End If
End Sub
Sub Merge(ByVal arr() As Integer, ByVal left As Integer, ByVal mid As Integer, ByVal right As Integer)
Dim n1 As Integer = mid - left + 1
Dim n2 As Integer = right - mid
Dim L(n1 - 1) As Integer
Dim R(n2 - 1) As Integer
Dim i, j, k As Integer
For i = 0 To n1 - 1
L(i) = arr(left + i)
Next
For j = 0 To n2 - 1
R(j) = arr(mid + 1 + j)
Next
i = 0
j = 0
k = left
While i < n1 AndAlso j < n2
If L(i) <= R(j) Then
arr(k) = L(i)
i += 1
Else
arr(k) = R(j)
j += 1
End If
k += 1
End While
While i < n1
arr(k) = L(i)
i += 1
k += 1
End While
While j < n2
arr(k) = R(j)
j += 1
k += 1
End While
End Sub
6. 힙 정렬(Heap Sort)
힙 정렬은 힙(Heap) 자료구조를 이용하여 정렬하는 알고리즘 중 하나입니다. 먼저 배열을 힙으로 변환한 후, 가장 큰 값을 추출하여 배열의 뒤쪽부터 채워나가는 방식으로 정렬합니다. 힙 정렬은 항상 O(nlogn)의 시간 복잡도를 가집니다.
Sub HeapSort(ByVal arr() As Integer)
Dim n As Integer = arr.Length
For i As Integer = n \ 2 - 1 To 0 Step -1
Heapify(arr, n, i)
Next
For i As Integer = n - 1 To 0 Step -1
Swap(arr(0), arr(i))
Heapify(arr, i, 0)
Next
End Sub
Sub Heapify(ByVal arr() As Integer, ByVal n As Integer, ByVal i As Integer)
Dim largest As Integer = i
Dim left As Integer = 2 * i + 1
Dim right As Integer = 2 * i + 2
If left < n AndAlso arr(left) > arr(largest) Then
largest = left
End If
If right < n AndAlso arr(right) > arr(largest) Then
largest = right
End If
If largest <> i Then
Swap(arr(i), arr(largest))
Heapify(arr, n, largest)
End If
End Sub
7. 계수 정렬(Counting Sort)
계수 정렬은 정수 배열에 대해서만 정렬할 수 있는 특수한 정렬 알고리즘입니다. 배열의 값이 0부터 최대값까지의 카운트 배열을 생성한 후, 각 숫자의 등장 횟수를 세어 카운트 배열에 누적시킵니다. 마지막으로 카운트 배열을 순회하며 각 숫자가 등장한 횟수만큼 배열에 다시 채워주는 방식으로 정렬합니다. 계수 정렬은 O(n+k)의 시간 복잡도를 가지며, k는 정수 배열의 최대값을 의미합니다.
Sub CountingSort(ByVal arr() As Integer)
Dim n As Integer = arr.Length
Dim maxVal As Integer = arr.Max()
Dim count(maxVal) As Integer
Dim output(n - 1) As Integer
For i As Integer = 0 To n - 1
count(arr(i)) += 1
Next
For i As Integer = 1 To maxVal
count(i) += count(i - 1)
Next
For i As Integer = n - 1 To 0 Step -1
output(count(arr(i)) - 1) = arr(i)
count(arr(i)) -= 1
Next
For i As Integer = 0 To n - 1
arr(i) = output(i)
Next
End Sub
이제 위에서 구현한 모든 정렬 알고리즘을 사용하여, 정수 배열을 오름차순으로 정렬하는 예시 코드를 작성해보겠습니다.
Sub Main()
Dim arr() As Integer = {10, 2, 6, 7, 1, 3, 8, 5, 9, 4}
Dim n As Integer = arr.Length
' 선택 정렬
SelectionSort(arr)
' 버블 정렬
BubbleSort(arr)
' 삽입 정렬
InsertionSort(arr)
' 퀵 정렬
QuickSort(arr, 0, n - 1)
' 병합 정렬
MergeSort(arr, 0, n - 1)
Console.WriteLine("정렬 결과: ")
For Each num As Integer In arr
Console.Write(num & " ")
Next
End Sub
위 예시 코드를 실행하면, 다음과 같은 결과가 출력됩니다.
정렬 결과: 1 2 3 4 5 6 7 8 9 10
마치며...
정렬 알고리즘을 포함한 모든 알고리즘은 언어의 종류에 구애받지 않는 개념적인 부분이고, 이번 글에서는 이런 정렬 알고리즘을 VB.NET을 이용해서 구현한 예제들을 수록했습니다. 정렬은 프로그래밍을 하다 보면 정말 빈번하게 많이 사용되는 기능이니 꼭 숙지하시기 바라며, 아래 관련글에 있는 List의 정렬은 이들 정렬 알고리즘이 List 클래스 내부에 포함되어 손쉽게 정렬을 할 수 있으니 참고하시기 바랍니다.
관련글 : 2022.12.05 - [VB.NET] - VB.NET OrderBy, ThenBy를 이용한 리스트 정렬 (역순정렬 포함)
VB.NET OrderBy, ThenBy를 이용한 리스트 정렬 (역순정렬 포함)
정렬이라는게 어렵지는 않지만 많이 번거롭다. 무엇보다 정렬속도를 신경써야되니 알려진 알고리즘을 사용해서 이진정렬등의 방법으로 정렬을 직접 해줬다. 그런데 List를 사용하면 이 정렬을
chakhani.tistory.com
'VB.NET > 왕초보' 카테고리의 다른 글
VB.NET에서 스택(Stack)과 큐(Queue) 사용하기 (0) | 2023.04.14 |
---|---|
VB.NET에서 XML 처리하기 (0) | 2023.04.13 |
VB.NET에서의 문자열 처리 (0) | 2023.04.09 |
VB.NET으로 TTS 구현하기 : 한국어, 영어, 일본어 - 글씨를 음성으로 변환 (0) | 2023.04.04 |
VB.NET - Label의 크기에 맞춰서 글자 크기를 변경하기 (0) | 2023.04.03 |