[C#] 알고리즘 1 (정렬)
[C#] 알고리즘 1 (정렬)
정렬 알고리즘
- 주어진 데이터 세트를 특정 순서(대개는 숫자의 오름차순 또는 내림차순, 문자열의 사전식 순서)로 배열하는 방법을 제공.
선택 정렬 ( Selection Sort )
- 선택 정렬은 배열에서 최소값(또는 최대값)을 찾아 맨 앞(또는 맨 뒤)와 교환하는 방법.
- 시간 복잡도: 최악의 경우와 평균적인 경우 모두 O(n^2)
- 공간 복잡도: O(1) (상수 크기의 추가 공간이 필요하지 않음)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
int[] arr = new int[] { 5, 2, 4, 6, 1, 3 }; for (int i = 0; i < arr.Length - 1; i++) { int minIndex = i; for (int j = i + 1; j < arr.Length; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } foreach (int num in arr) { Console.WriteLine(num); }
삽입 정렬 ( Insertion Sort )
- 삽입 정렬은 정렬되지 않은 부분에서 요소를 가져와 정렬된 부분에 적절한 위치에 삽입하는 방법이다.
- 시간 복잡도: 최악의 경우 O(n^2), 하지만 정렬되어 있는 경우에는 O(n)
- 공간 복잡도: O(1) (상수 크기의 추가 공간이 필요하지 않음)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
int[] arr = new int[] { 5, 2, 4, 6, 1, 3 }; for (int i = 1; i < arr.Length; i++) { int j = i - 1; int key = arr[i]; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } foreach (int num in arr) { Console.WriteLine(num); }
퀵 정렬 ( Quick Sort )
- 퀵 정렬은 피벗을 기준으로 작은 요소들은 왼쪽, 큰 요소들은 오른쪽으로 분할하고 이를 재귀적으로 정렬하는 방법.
- 시간 복잡도: 최악의 경우 O(n^2), 하지만 평균적으로 O(n log n)
- 공간 복잡도: 평균적으로 O(log n), 최악의 경우 O(n) (재귀 호출에 필요한 스택 공간)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
void QuickSort(int[] arr, int left, int right) { if (left < right) { int pivot = Partition(arr, left, right); QuickSort(arr, left, pivot - 1); QuickSort(arr, pivot + 1, right); } } int Partition(int[] arr, int left, int right) { int pivot = arr[right]; int i = left - 1; for (int j = left; j < right; j++) { if (arr[j] < pivot) { i++; Swap(arr, i, j); } } Swap(arr, i + 1, right); return i + 1; } void Swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } int[] arr = new int[] { 5, 2, 4, 6, 1, 3 }; QuickSort(arr, 0, arr.Length - 1); foreach (int num in arr) { Console.WriteLine(num); }
병합 정렬 ( Merge Sort )
- 병합 정렬은 배열을 반으로 나누고, 각 부분을 재귀적으로 정렬한 후, 병합하는 방법이다.
- 시간 복잡도: 모든 경우에 대해 O(n log n)
- 공간 복잡도: O(n) (정렬을 위한 임시 배열이 필요함)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
void MergeSort(int[] arr, int left, int right) { if (left < right) { int mid = (left + right) / 2; MergeSort(arr, left, mid); MergeSort(arr, mid + 1, right); Merge(arr, left, mid, right); } } void Merge(int[] arr, int left, int mid, int right) { int[] temp = new int[arr.Length]; int i = left; int j = mid + 1; int k = left; while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } for (int l = left; l <= right; l++) { arr[l] = temp[l]; } } int[] arr = new int[] { 5, 2, 4, 6, 1, 3 }; MergeSort(arr, 0, arr.Length - 1); foreach (int num in arr) { Console.WriteLine(num); }
This post is licensed under CC BY 4.0 by the author.