선택 알고리즘을 C++로 구현해보자.
선택 알고리즘이란, 배열 $ A=[p \dotsb r] $ 에서 $i$번째 작은 원소를 찾는 알고리즘이다.
평균적으로 선형 시간이 소요되는 알고리즘과, 최악의 경우에도 선형 시간이 보장되는 알고리즘 두 가지가 있다. (출처: 문병로, 쉽게 배우는 알고리즘, 한빛아카데미)
다음 코드는 평균적으로 선형 시간이 소요되는 알고리즘이다.
퀵 정렬과 굉장히 유사한 방식이다.
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
|
#include <bits/stdc++.h>
using namespace std;
int a[1000001];
int Partition(int x, int y) {
int s = x, e = x, p = a[y];
for (; e < y; e++)
if (a[e] < p) swap(a[s++], a[e]);
swap(a[s], a[y]);
return s;
}
int select(int x, int y, int i) {
if (x == y) return a[x];
int p = Partition(x, y);
int k = p - x + 1;
if (k == i) return a[p];
if (k < i) return select(p + 1, y, i - k);
else return select(x, p - 1, i);
}
int main() {
int n, k;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
cin >> k;
cout<< select(1, n, k);
}
|
'공부 > 정보과학' 카테고리의 다른 글
[python] pyautogui를 이용한 매크로 (0) | 2024.02.09 |
---|---|
[CodeUp] 3516: 사탕 줍기 3 C++ (0) | 2024.01.19 |
정렬 알고리즘 C++ 구현 (0) | 2024.01.16 |