순차 탐색 코드
int seqSearch(int key,int low, int high){
int i;
for(i = low;i <= high ; i++){
if(list[i] == key)
return i;
}
return -1;
}
개선된 순차 탐색 코드
int seqSearch2(int key,int low, int high){
int i;
list[high+1] = key;
for(i = low; list[i] != key ; i++) ;
if(i == (high + 1)) return -1;
else return i;
}
코드(순환 호출 버전)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAX_ELEMENTS 10
int list[MAX_ELEMENTS];
int count; // 수행횟수
int binSearch(int list[], int n, int searchNum)
{
int left = 0;
int right = n - 1;
int middle;
count = 0;
while (left <= right) { // 아직 숫자들이 남아 있으면
count++;
middle = (left + right) / 2;
if (searchNum == list[middle]) {
return middle;
}
else if (searchNum < list[middle]) {
right = middle - 1;
}
else {
left = middle + 1;
}
}
return -1; // 발견되지 않음
}
int main()
{
int i;
int search_number;
int return_value;
for (i = 0; i < MAX_ELEMENTS; i++)
list[i] = i;
printf("숫자를 입력하시요.\n");
scanf("%d", &search_number);
return_value = binSearch(list, MAX_ELEMENTS, search_number); // 이진탐색
printf("return value=%d\n", return_value);
printf("문자의 수행횟수=%d\n ", count);
return 0;
}
코드
#include <stdio.h>
#define MAX_SIZE 9
#define INDEX_SIZE 3
int list[MAX_SIZE] = { 3, 9,15, 22, 31, 55, 67, 88, 91 };
int n = MAX_SIZE;
typedef struct {
int key;
int index;
} itable;
itable indexList[INDEX_SIZE] = { {3,0}, {22,3}, {67,6} };
int seqSearch(int key, int low, int high)
{
int i;
for (i = low; i <= high; i++)
if (list[i] == key)
return i; /* 탐색에 성공하면 키 값의 인덱스 반환 */
return -1; /* 탐색에 실패하면 -1 반환 */
}
/* INDEX_SIZE는 인덱스 테이블의 크기,n은 전체 데이터의 수 */
int indexSearch(int key) // key : 31
{
int i, low, high;
/* 키 값이 리스트 범위 내의 값이 아니면 탐색 종료 */
if (key<list[0] || key>list[n - 1])
return -1;
/* 인덱스 테이블을 조사하여 해당키의 구간 결정 */
for (i = 0; i < INDEX_SIZE - 1; i++) {
if (indexList[i].key <= key &&
indexList[i + 1].key > key)
break; // key값과 가장 비슷한 값이 있는 index번호를 찾는다.
}
if (i == INDEX_SIZE - 1) { /* 인덱스테이블의 끝이면 */
low = indexList[i].index;
high = n - 1;
}
else {
low = indexList[i].index;
high = indexList[i + 1].index - 1;
}
/* 예상되는 범위만 순차 탐색 */
return seqSearch(key, low, high);
}
//
void main()
{
int i;
i = indexSearch(31);
if (i >= 0) {
printf("탐색 성공 i=%d\n", i);
}
else {
printf("탐색 실패\n");
}
for (int j = 0;j < 3;j++) {
printf("%d %d\n", indexList[j].index, indexList[j].key);
}
}
탐색 위치 = (55 - 3) / (91 - 3) * (9-0) + 0 = 5.31 ≒ 5
코드
#include <stdio.h>
#define MAX_SIZE 1000
int list[MAX_SIZE];
initList()
{
int i;
for (i = 0;i < 1000;i++)
list[i] = 7 * i;
}
int searchInterpolation(int key, int n)
{
int low, high, j;
low = 0;
high = n - 1;
while ((list[high] >= key) && (key > list[low])) {
j = ((float)(key - list[low]) / (list[high] - list[low]) *
(high - low)) + low;
if (key > list[j]) low = j + 1;
else if (key < list[j]) high = j - 1;
else low = j;
}
if (list[low] == key) return(low); //found(r[low])
else return -1; // notfound(key)
}
//
void main()
{
int i = 0;
initList();
i = searchInterpolation(49,1000);
if (i >= 0) {
printf("탐색 성공 i=%d\n", i);
}
else {
printf("탐색 실패\n");
}
}