C언어 이분탐색 질문
글쓴이: rhkdwls52 / 작성시간: 금, 2018/05/04 - 6:24오후
int idxsearch(int ar[], int first, int last, int target) {
int mid = (first + last) / 2;
if (first > last)
return -1;
else {
if (ar[mid] == target)
return mid;
else {
if (ar[mid] > target) {
last = mid - 1;
idxsearch(ar, first, last, target);
}
else {
first = mid + 1;
idxsearch(ar, first, last, target);
}
}
}
}
int main() {
scanf_s(" %d", &num);
int *inorder = malloc(sizeof(int)*num);
int *levelorder = malloc(sizeof(int)*num);
for (int i = 0; i < num; i++)
scanf_s(" %d", &inorder[i],sizeof(int));
for (int j = 0; j < num; j++)
scanf_s(" %d", &levelorder[j],sizeof(int));
printf("\n");
printf(" %d\n", idxsearch(inorder, 0, num-1, 3));
printf(" %d\n", idxsearch(levelorder, 0, num-1, 1));
//printsol();
free(levelorder);
free(inorder);
}첫번째 열에는 몇개의 데이터를 입력할 것인지가 나오고
두번째 열에는 입력한 갯수만큼 데이터를 넣습니다.
의도
입력한 데이터를 토대로 해당 인덱스가 어디인지 출력하는 프로그램
입력데이터
3
3 2 1
3 2 1
이렇게 하면 출력이
0
2
가 되어야 정상이지만
아무것도 찾을 수 없다는
-1
-1
를 출력하게 되는데 도통 모르겠습니다..
환경은 windows 10 이며, visual studio 2017로 작성하였습니다.
답변주시면 감사하겠습니다..
Forums:


참고해보세요.
http://codepad.org/29OAJQ9r
int idxsearch(int ar[], int first, int last, int target) { int mid = (first + last) / 2; if (first > last) { printf("-1\n"); printf("\n"); return -1; } else { if (ar[mid] == target) { printf("mid : %d\n", mid); printf("\n"); return mid; } else { if (ar[mid] > target) { last = mid - 1; printf("last1 %d\n", last); idxsearch(ar, first, last, target); printf("last2 %d\n", last); } else { first = mid + 1; printf("first1 %d\n", first); idxsearch(ar, first, last, target); printf("first2 %d\n", first); } } } printf("return 0\n"); printf("\n"); return 0; } //이분 탐색(Binary Search) - C언어 //https://blog.naver.com/jsky10503/221248921302 int idxsearch2 (int ar[], int first, int last, int target) { int mid; while(1) { mid = (first + last) / 2; if (ar[mid] < target) { first = mid + 1; printf("first : %d\n", first); } else if(ar[mid] > target) { last = mid - 1; printf("last : %d\n", last); } else { break; } } printf("target %d ar %d\n", target, mid); return 0; } int idxsearch3 (int ar[], int left, int right, int target) { static int count = 0; int mid = (left + right) / 2; printf("현재 값 : %d\n", ar[mid]); count = count + 1; printf("검색 횟수 확인 : %d\n", count); if(count > 10) { printf("검색 횟수를 초과했습니다.\n"); return 0; } // if (target == ar[mid]) { printf("찾는값이 중간값과 같으면. 찾았다.\n"); return target; } // else if (ar[mid] < target) { printf("찾는값이 중간값 보다 크다면. 중간값 부터 오른쪽으로 검색\n"); left = mid; idxsearch3(ar, left, right, target); } // else { printf("찾는값이 중간값 보다 작으면. 중간값 부터 왼쪽으로 검색\n"); right = mid; idxsearch3(ar, left, right, target); } printf("return 0\n"); printf("\n"); return 0; } int main() { // scanf_s(" %d", &num); int num = 10; int *inorder = (int*)malloc(sizeof(int)*num); int *levelorder = (int*)malloc(sizeof(int)*num); // for (int i = 0; i < num; i++) // scanf_s(" %d", &inorder[i],sizeof(int)); inorder[0] = 10; inorder[1] = 20; inorder[2] = 30; inorder[3] = 40; inorder[4] = 50; inorder[5] = 60; inorder[6] = 70; inorder[7] = 80; inorder[8] = 90; printf("\n"); printf("\n"); // printf("idxsearch %d\n", idxsearch(inorder, 0, num-1, 80)); // printf("idxsearch %d\n", idxsearch(inorder, 0, num-1, 20)); // printf(" %d\n", idxsearch2(inorder, 0, num-1, 80)); // printf(" %d\n", idxsearch2(inorder, 0, num-1, 20)); printf(" %d\n", idxsearch3(inorder, 0, num-1, 40)); //printsol(); free(levelorder); free(inorder); }//출력 결과
현재 값 : 50
검색 횟수 확인 : 1
찾는값이 중간값 보다 작으면. 중간값 부터 왼쪽으로 검색
현재 값 : 30
검색 횟수 확인 : 2
찾는값이 중간값 보다 크다면. 중간값 부터 오른쪽으로 검색
현재 값 : 40
검색 횟수 확인 : 3
찾는값이 중간값과 같으면. 찾았다.
return 0
return 0
0
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
감사합니다!
열심히 공부하겠습니다.
idxsearch --> return
idxsearch --> return idxsearch
댓글 달기