본문 바로가기
알고리즘/자료구조(C)

검색 알고리즘

by 진진리 2023. 9. 19.
728x90

선형 검색(linear search): O(n)

#include <stdio.h>
#include <stdlib.h>

int search(const int a[], int n, int key){
  int i;
  for(i=0;i<n;i++)
    if(a[i]==key) return i;
  return -1;
}

int main(void) {
  int i, nx, ky, idx;
  int *x;
  
  puts("선형 검색");
  printf("요소 개수: ");
  scanf("%d",&nx);
  x = calloc(nx, sizeof(int));
  for(i=0;i<nx;i++){
    printf("x[%d]: ",i);
    scanf("%d",&x[i]);
  }

  printf("검색값: ");
  scanf("%d",&ky);
  idx = search(x, nx, ky);
  if(idx==-1) puts("검색에 실패했습니다.");
  else printf("%d(은)는 x[%d]에 있습니다.\n",ky, idx);

  free(x);
  
  return 0;
}

 

  • 보초법: 찾는 값을 배열 맨 끝에 저장 (저장하는 값을 '보초'라고 함)
    • 종료 판단 횟수를 2회에서 1회로 줄일 수 있음
#include <stdio.h>
#include <stdlib.h>

int search(int a[], int n, int key){
  int i;
  a[n] = key;
  while(1) {
    if(a[i]==key) break;
    i++;
  }
  return i == n ? -1 : i;
}

int main(void) {
  int i, nx, ky, idx;
  int *x;
  
  puts("선형 검색(보초법)");
  printf("요소 개수: ");
  scanf("%d",&nx);
  x = calloc(nx+1, sizeof(int));
  for(i=0;i<nx;i++){
    printf("x[%d]: ",i);
    scanf("%d",&x[i]);
  }

  printf("검색값: ");
  scanf("%d",&ky);
  idx = search(x, nx, ky);
  if(idx==-1) puts("검색에 실패했습니다.");
  else printf("%d(은)는 x[%d]에 있습니다.\n",ky, idx);

  free(x);
  
  return 0;
}

이진 검색(binary search): O(log n)

배열이 정렬되어 있어야 함

#include <stdio.h>
#include <stdlib.h>

int bin_search(const int a[], int n, int key){
  int pl=0;
  int pr = n-1;
  int pc;
  do{
    pc = (pl+pr) /2;
    if(a[pc]==key) return pc;
    else if(a[pc] < key) pl = pc+1;
    else pr = pc-1;
  } while (pl <= pr);
  return -1;
}

int main(void) {
  int i, nx, ky, idx;
  int *x;
  
  puts("이진 검색");
  printf("요소 개수: ");
  scanf("%d",&nx);
  x = calloc(nx, sizeof(int));
  printf("오름차순으로 입력하세요.\n");
  for(i=0;i<nx;i++){
    printf("x[%d]: ",i);
    scanf("%d",&x[i]);
  }

  printf("검색값: ");
  scanf("%d",&ky);
  idx = bin_search(x, nx, ky);
  if(idx==-1) puts("검색에 실패했습니다.");
  else printf("%d(은)는 x[%d]에 있습니다.\n",ky, idx);

  free(x);
  
  return 0;
}

 

 

  • bsearch 함수(정렬된 배열에서 검색하는 함수)
    • #include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>

int int_cmp(const int *a, const int *b){
  if(*a < *b) return -1;  //첫 번째가 작으면 음수
  else if (*a > *b) return 1; //첫 번째가 크면 양수
  else return 0;  //같으면 0
}

int main(void) {
  int i, nx, ky;
  int *x;
  int *p;
  
  puts("bseary 함수를 사용하여 검색");
  printf("요소 개수: ");
  scanf("%d",&nx);
  x = calloc(nx, sizeof(int));
  printf("오름차순으로 입력하세요.\n");
  for(i=0;i<nx;i++){
    printf("x[%d]: ",i);
    scanf("%d",&x[i]);
  }

  printf("검색값: ");
  scanf("%d",&ky);
  
  p = bsearch(&ky, x, nx, sizeof(int), // 키값 포인터, 배열 포인터, 요소 개수, 요소 크기
    (int(*)(const void *, const void *)) int_cmp); // 비교 함수, 호출 시 형변환을 하지 않아도 됨
  //p의 값은 '찾은 요소의 포인터'이므로 p-x로 인덱스를 얻을 수 있음
  if(p==NULL) puts("검색에 실패했습니다.");
  else printf("%d(은)는 x[%d]에 있습니다.\n",ky, (int)(p-x));

  free(x);
  
  return 0;
}

비교함수의 양수, 음수를 바꾸면 내림차순 배열에서 검색 가능

 

 

'알고리즘 > 자료구조(C)' 카테고리의 다른 글

  (0) 2023.09.22
스택  (0) 2023.09.22
구조체  (0) 2023.09.19
배열  (0) 2023.09.19
기초  (0) 2023.09.19