PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2008/05/23 18:14:40
Name 루시리스
Subject 머지소트, 바이너리서치, C언어 잘 아시는분 계신가요...
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

void merge(int h, int m, char parm_a[], char parm_b[], char parm_string[])
{
    // string이 들어있는 배열은 0에서 부터 시작하기때문에 0을 대입  
    int i = 0, j = 0, k = 0;
  
    // 머지소트는 두 배열을 합칠때 크기를 비교해서 합치다가 한 배열이 끝이면 루프탈출
    while(i < h && j < m){
        if(parm_a[i] < parm_b[j]){
            parm_string[k] = parm_a[i];
            i++;
        } else {
            parm_string[k] = parm_b[j];
            j++;
        }
        k++;
    }

    // 다른 한 배열의 끝이 나올때까지 머지 배열에 대입해주어야함
    while(i <  h) parm_string[k++] = parm_a[i++];
    while(j <  m) parm_string[k++] = parm_b[j++];  
}
  
void mergesort(int parm_count, char parm_string[])
{
    if(parm_count > 1){
        int h = parm_count / 2, i;
        int m = parm_count - h;

        char *p_string_a = (char *)malloc(h*sizeof(int));
        char *p_string_b = (char *)malloc(m*sizeof(int));

        if(p_string_a == NULL) exit(EXIT_FAILURE);  // 메모리 할당 실패
        if(p_string_b == NULL) exit(EXIT_FAILURE);  // 메모리 할당 실패

        for(i = 0; i < h; i++) p_string_a[i] = parm_string[i];
        for(i = h; i < parm_count; i++) p_string_b[i - h] = parm_string[i];

        mergesort(h, p_string_a);
        mergesort(m, p_string_b);
        merge(h, m, p_string_a, p_string_b, parm_string);
  
        // 동적으로 할당한 메모리를 반환한다.
        free(p_string_a);
        free(p_string_b);
    }
}

int Binary_Search(int str_length, char str_data[], char *str_key)
{
        int x = 0, data_mid, data_count=str_length-1;
        char str_middata[1];
        
            while(x <= data_count){
                        data_mid = (x + data_count) / 2;
                        str_middata[1] = str_data[data_mid];
                
                        if(strcmp(str_key, str_middata) == -1)
                                data_count = data_mid - 1;
                
                        else if(strcmp(str_key, str_middata) == 1)
                                x = data_mid + 1;
                
                        else
                                return data_mid;
                }

                return -1;

}

  
void main()
{
    int count = 0;
    char input_string[64], *find_string, data_search;

    printf("정렬할 문자열을 입력하세요 : ");
    scanf("%s", input_string);

    // 정렬할 문자열의 길이를 얻는다.
    count = strlen(input_string);
    mergesort(count, input_string);

    printf("\n정렬된 문자열 : %s\n\n", input_string);

    printf("이진 검색을 이용하여 찾을 문자 하나를 입력하세요 : ");
    scanf("%s", &find_string);
    printf("\n");

        data_search=Binary_Search(count, input_string, find_string);

        if(data_search != -1)
                printf("%d번째에 위치한 문자입니다.\n\n", data_search+1);
        
        else
                printf("찾을 수 없습니다.\n");
        

}



입력받은 문자들을 머지소트로 정렬한후 한 문자를 입력하면 바이너리 서치로 그 문자가 위의 정렬된 문자열에서 몇번째

위치에 있는지 찾는 프로그램인데요.. 머지소트는 해결이되었는데 바이너리서치 함수 부분이 해결이안됬네요...

제가 생각하기에는 맞게 짰다고 생각되는데 실행하니까 제대로 실행이안되네요..

어디가 문제인지 알수있을까요?


통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
08/05/23 19:57
수정 아이콘
떨어지는 수준으로 지적이 가능할까 모르겠지만...;

바이너리 서치는 오름차순 또는 내림차순으로 정렬된 수의 나열에서 찾기 적합한데 문자열에서 특정한 단어를 찾으려면 그 단어들이 enum으로 순서들이 정의되어 있고 내부 문자열에서도 정렬되어 있어야 서치가 가능합니다.

이럴땐 바이너리 서치보단 선형탐색[Linear search]를 추천합니다. 그냥 문자열 처음부터 쭉 읽어가면서 맞는 부분을 찾아가는 알고리즘 이죠.
루시리스
08/05/23 20:29
수정 아이콘
교수님이 바이너리 서치로 꼭 해오라고 하셔서요.. 우선 머지소트로 문자들을 오름차순으로 정렬한후 바이너리 서치로 찾는것인데 도저히 여기서 진행이안되네요..
와후-만세
08/05/23 20:56
수정 아이콘
문자열과 문자에 대해서 개념이 조금 헷갈리신것 같네요. 바이너리 서치 부분만 봣는데
str_middata[1] = str_data[data_mid];
이 줄도 이상하고
char 배열 자체를 [1] 로 잡은것도 이상합니다
Null 문자를 고려해주는 것이 바람직해요.
루시리스
08/05/23 21:05
수정 아이콘
와후-만세님//문자 하나를 지정할때는 char find_string[1] 이런식으로 하는거아닌가요?

그냥 char find_string 하고 scanf로 find_string을 받으면

local variable 'find_string' used without having been initialized 이런 경고가 뜨네요..
08/05/23 21:10
수정 아이콘
char find_string으로 선언하고
scanf에서는 &find_string 이렇게 참조자로 받아야죠.
루시리스
08/05/23 21:23
수정 아이콘
Crom님// 방금 수정해서 실행했는데 제대로 작동이안되네요.. 후우....
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
37268 비트가 강한 일렉트로니카를 알고 싶습니다. [2] 임요환의 DVD1939 08/05/24 1939
37265 면티 질문입니다. [3] AerospaceEng.2235 08/05/24 2235
37264 KTF 핸드폰 EVER에서 SKY로 기기변경을 했는데 전화번호부 어떻게 옮기나요? [5] 해왕성2275 08/05/24 2275
37263 인터넷으로 사는 핸드폰 믿을만 한가요? [9] 국악1844 08/05/24 1844
37262 목소리가 얇고 성량이 작은 남자가 노래방에서 부를만한 노래 [6] EzMura8698 08/05/24 8698
37261 FD테란 빌드가 어떻게 되나요?? [7] ElleNoeR2329 08/05/24 2329
37260 호날두는 왜 긴팔을 좋아하나요? [10] 임요환의 DVD5549 08/05/24 5549
37259 원룸에 사는데 쥐가 나왔어요 [4] Nanum4275 08/05/24 4275
37258 군 인트라넷 질문입니다. [3] Enjoy3295 08/05/24 3295
37257 혹시 피지알 人들만에 채널이 따로있나요? [3] 유안2111 08/05/24 2111
37256 대학원에서는 공부를 어떻게 하나요? [2] axbycz2563 08/05/24 2563
37255 스타 저그대 테란 질문 드립니다. [6] o에코o1702 08/05/24 1702
37254 합의에 관해서 질문드립니다. [8] 컨트롤황제1877 08/05/24 1877
37251 피아노연주관련 질문 좀 드릴게요~ [5] Jess:D2140 08/05/24 2140
37250 미국인들의 주식은 뭔가요? [6] .JunE.10135 08/05/23 10135
37249 mbc 히어로센터에 대해서~ [2] Wow1848 08/05/23 1848
37248 부산에 놀만한데 없을까요???? [8] L = Lawliet2198 08/05/23 2198
37247 루니에게 이적 관련 루머(?)나 소식이 거의 없는 이유가 뭐죠? [11] 비야레알1925 08/05/23 1925
37246 USB 메모리가 맛이 간 것 같습니다 T_T [2] BluSkai2135 08/05/23 2135
37245 하드디스크 호환에대해서 [3] eros[zerg]2179 08/05/23 2179
37242 베넷에서 게임할떄 TvsZ [4] 바포메트1824 08/05/23 1824
37240 드래곤볼 애니 질문좀 할게요~ [6] 언젠가는..2183 08/05/23 2183
37239 머지소트, 바이너리서치, C언어 잘 아시는분 계신가요... [6] 루시리스2574 08/05/23 2574
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로