본문 바로가기
::public/알고리즘

탐색

by 해맑은욱 2019. 9. 6.

*순차 탐색

// 정렬되지 않은 배열 arr의 순차탐색
int sequentialSearch(int arr[], int key, int low, int high)
{
    for (int i = low; i <= high; i++)
    {
        if (arr[i] == key)
            return i;
    }
    return -1// 탐색 실패
}
 
// 오름차순으로 정렬된 배열 arr의 순차탐색
int sortedSequentialSearch(int arr[], int key, int low, int high)
{
    int i;
    for (i = low; i <= high; i++)
    {
        if (arr[i] > key)
            return -1;
        if (arr[i] == key)
            return i;
    }
    return -1// 탐색 실패
}
cs

*이진 탐색

// 재귀호출을 이용한 이진탐색 함수
int binarySearch(int arr[], int key, int low, int high)
{
    int middle;
    if (low <= high)                // 하나 이상의 항목이 있어야 탐색
    {
        middle = (low + high) / 2;
        if (key == arr[middle])        // 탐색 성공
            return middle;
        else if (key < arr[middle])    // 왼쪽 부분 탐색
            return binarySearch(arr, key, low, middle - 1);
        else                        // 오른쪽 부분 탐색
            return binarySearch(arr, key, middle + 1, high);
    }
    return -1;                        // 탐색 실패
}
 
// 반복문을 이용한 이진탐색 함수
int binarySearchIter(int arr[], int key, int low, int high)
{
    int middle;
    while (low <= high)
    {
        middle = (low + high) / 2;
        if (key == arr[middle])
            return middle;
        else if (key > arr[middle])
            low = middle + 1;
        else
            high = middle - 1;
    }
    return -1;
}
cs

*색인 순차 탐색

;정렬되어있는 자료에 대한 인덱스 테이블(index table)을 추가로 사용하여 탐색 효율을 높인 검색 방법이다.

struct Index
{
    int key;    // 키 값
    int index;    // 키 값의 인덱스
};
// 색인 순차 탐색 함수
int indexedSearch(int arr[], int n, Index* tbl, int nTbl, int key)
{
    if (key < arr[0|| key > arr[n - 1])    // 키 값이 범위 밖
        return -1;
    for (int i = 0; i < nTbl; i++)
    {
        if (tbl[i].key <= key && tbl[i + 1].key > key)
            return sequentialSearch(arr, key, tbl[i].index, tbl[i + 1].index); // 순차 탐색
    }
    return sequentialSearch(arr, key, tbl[nTbl - 1].index, n);
}
cs

 

'::public > 알고리즘' 카테고리의 다른 글

DFS(깊이 우선 탐색) & BFS(너비 우선 탐색)  (0) 2023.08.17
기수 정렬(Radix Sort)  (0) 2019.09.06
BinaryTree 구현.  (0) 2019.08.23
퀵 정렬(Quick Sort)  (0) 2019.07.11
알고리즘 시간 복잡도  (0) 2019.06.26