4. 알고리즘
1) 검색 알고리즘
배열은 한 자료형의 여러 값들이 메모리상에 모여 있는 구조이다. 컴퓨터가 이 값에 접근할 때는 배열의 인덱스 하나하나에 접근하게 된다. 배열 안에 어떤 값이 있는지 확인하기 위해서는 다양한 방법이 있다.
2) 알고리즘 표기법

Big O - 알고리즘 실행 시간의 상한 (최악의 경우)
Big Ω - 알고리즘 실행 시간의 하한 (최선의 경우)
O(n^2)
O(n log n)
O(n)
O(log n)
O(1)
3) 선형 검색
선형검색 - 원하는 원소가 발견될 때까지 처음부터 마지막 자료까지 차례대로 검색한다.
모든 자료를 확인하기에 정확하지만 비효율적인 방법이다.
자료가 정렬되어있지 않거나, 추가적인 정보가 없어 모든 자료를 확인해야 하는 경우 유용하다.
#include <cs50.h>
#include <stdio.h>
#include <string.h>
typedef struct
{
string name;
string number;
}
person;
int main(void)
{
person people[4];
people[0].name = "EMMA";
people[0].number = "617–555–0100";
people[1].name = "RODRIGO";
people[1].number = "617–555–0101";
people[2].name = "BRIAN";
people[2].number = "617–555–0102";
people[3].name = "DAVID";
people[3].number = "617–555–0103";
// EMMA 검색
for (int i = 0; i < 4; i++)
{
if (strcmp(people[i].name, "EMMA") == 0)
{
printf("Found %s\\n", people[i].number);
return 0;
}
}
printf("Not found\\n");
return 1;
}4) 버블 정렬
버블 정렬은 정렬 알고리즘 중 하나로, 인접한 두 개의 자료 값을 비교하고 위치를 교환하는 방식으로 정렬하는 방법이다. 두개의 요소만 정렬하는 좁은 범위의 정렬에 집중하기에 간단하지만 정렬에 너무 많은 자원을 낭비하는 방법이기도 하다.
3 6 8 5 2 7 4 1
3 6 8 5 2 7 4 1
3 6 5 8 2 7 4 1 <
3 6 5 2 8 7 4 1 <
3 6 5 2 7 8 4 1 <
3 6 5 2 ****7 4 8 1 <
3 6 5 2 ****7 4 1 8 <
…
1 2 3 4 5 6 7 8
O(n^2)
Ω(n^2)
5) 선택 정렬
선택 정렬은 배열 안의 자료 중 가장 작은 수를 찾아 첫 번째(혹은 마지막)의 수와 교환하는 방식의 정렬이다. 교환 횟수를 최소화하는 반면 각 자료를 비교하는 횟수는 증가한다.
6 3 8 5 2 7 4 1
1 3 8 5 2 7 4 6
1 2 8 5 3 7 4 6
1 2 3 5 8 7 4 6
1 2 3 4 8 7 5 6
1 2 3 4 5 7 8 6
1 2 3 4 5 6 8 7
1 2 3 4 5 6 7 8
O(n^2)
Ω(n^2)
6) 정렬 알고리즘의 실행시간
정렬의 조건을 추가해 효율을 높일 수 잇다.
실행시간의 상한
O(n^2): 선택 정렬, 버블 정렬
O(n log n)
O(n): 선형 검색
O(log n): 이진 검색
O(1)
실행시간의 하한
Ω(n^2): 선택 정렬, 버블 정렬
Ω(n log n)
Ω(n)
Ω(log n)
Ω(1): 선형 검색, 이진 검색
⇒ 버블 정렬의 안쪽 루프에서 교환이 발생하지 않는다면 정렬이 잘된 상황이기에 바깥쪽 루프의 조건을 교환이 발생하지 않을때까지로 수정하면 하한 시간이 바뀐다.
실행시간의 하한
Ω(n^2): 선택 정렬
Ω(n log n)
Ω(n): 버블 정렬
Ω(log n)
Ω(1): 선형 검색, 이진 검색
7) 재귀
재귀는 스스로를 호출해 사용하는 함수를 말한다.
문제를 작게 쪼개 가장 작은 단위까지 쪼갠 후 그 문제를 해결한다. 같은 방식으로 큰 단위의 문제를 해결하게 설정하면 된다.
재귀는 주어진 문제를 비슷한 구조의 더 작은 문제로 나눌 수 있는 경우나 반복문의 중첩 횟수를 예측하기 어려운 경우 사용한다.
8) 병합 정렬
병합 정렬은 원소가 한 개가 될 때까지 계속해서 반으로 나누다가 다시 합쳐나가며 정렬하는 방식이다.
분할 > 병합의 과정을 재귀적으로 거친다.
7 4 5 2 6 3 8 1
7 4 5 2 | 6 3 8 1 < 분할
7 4 | 5 2 | 6 3 8 1 < 분할
7 | 4 | 5 2 | 6 3 8 1 < 분할 - 더이상 분할되지 않음
4 7 | 5 2 | 6 3 8 1 < 병합 - 작은 숫자가 먼저 오도록
4 7 | 2 5 | 6 3 8 1 < 병합
2 4 5 7 | 6 3 8 1 < 병합
…
1 2 3 4 5 6 7 8
O(n log n)
Ω(n log n)
Last updated
Was this helpful?