자료구조 알고리즘

순차 탐색과 이진 탐색

khon98 2020. 12. 17. 22:22

순차 탐색(Sequential Search)

- 특정한 원소를 찾기 위해 원소를 순차적으로 하나씩 탐색하는 방법

- O(N)의 시간 복잡도를 가짐

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LENGTH 1000

char **array;
int founded;

int main(void) {
    int n;
    char *word;
    word = malloc(sizeof(char) * LENGTH);
    scanf("%d %s", &n, word);
    array = (char**) malloc(sizeof(char*) * n);
    for (int i = 0; i < n; i++) {
        array[i] = malloc(sizeof(char) * LENGTH);
        scanf("%s", array[i]);
    }
    for (int i = 0; i < n; i++) {
        if (! strcmp(array[i], word)) {
            printf("%d번째 원소.\n", i + 1);
            founded = 1;
        }
    }
    if (!founded)printf("원소를 찾을 수 없음.\n");
    system("pause");
    return 0;
}

 

이진 탐색(Binary Search)

- 배열 내부 데이터가 이미 정렬되어 있는 상황에서 사용 가능한 알고리즘

- 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 특징이 있음

- 한 번 확인할 때마다 보아야 하는 원소의 개수가 절반씩 줄어든다는 점에서 탐색 시간이 O(logN)의 시간 복잡도를 가짐

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100000

int a[MAX_SIZE];
int founded = 0;

int search(int start, int end, int target) {
    if (start > end) return -9999;
    int mid = (start + end) / 2;
    if (a[mid] == target) return mid;
    else if (a[mid] > target) return search(start, mid - 1, target);
    else return search(mid + 1, end, target);
}

int main(void) {
    int n, target;
    scanf("%d %d", &n, &target);
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);
    int result = search(0, n - 1, target);
    if (result != -9999) printf("%d번째 원소.\n", result + 1);
    else printf("원소를 찾을 수 없음.\n");
    system("pause");
    return 0;
}