문자열을 오름차순으로 소팅하는건데여...잘안되네요... 도와주

익명 사용자의 이미지

알고리즘이라는 과목을 배우면서...
짜게된건데요...
포인터를 잘 몰라서 그런지..1주일 내내 매달려도
(다른데도 물어보고 책을 봐도)머리만 아프고
풀리지가 않네요.
배열포인터로 문자열을 비교해서 오름차순으로 우선....
소팅을 한후에 이진탐색으로 important를 찾는건데요
이진탐색은 두번째 문제고
소팅이 안되고 있습니다.
그냥 숫자로는 하겠는데 문자열로는 도저히 안풀리네요
strcmp함수도 어디다 적용해야할지 모르겠습니다.
소스입니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//#define maxsize 11

void merge_sort(char A[], int low, int high); /* 머지소트 함수 선언 */
void merge(char A[], int low, int mid, int high); /* 머지 함수 선언 */
void main()
{
int i;

char *keys[11]= {"algorithm", "is", "one", "of", "the", "most", "important", "courses", "in","computer", "science"};
//배열포인터로 초기화

printf(" *** the data before the sort **** \n");

printf("A = ");

for(i=0; i<maxsize; i++)
{
printf(" %s", keys[i]);
}
printf("\n");

merge_sort(*keys, 0, maxsize); // merge_sort 함수 소출

printf("\n **** result of the merge sort ****/\n");

for(i=0; i<maxsize; i++)
{
printf("%s", keys[i]); // end for
}
printf("\n");
}
/**********************************************************/
/* 기 능 : MERGE SORT MAIN FUNCTION
/* 인 자 : A[] => 소트할 배열
/* : low => 소트할 배열
/* : high => 소트할 배열
/* 리턴값 : 없음
/**********************************************************/
void merge_sort(char A[maxsize], int low, int high)
{
int mid;
if( low < high ) {
mid = (low + high) / 2;
merge_sort(A, low, mid);
merge_sort(A, mid+1, high);
merge(A, low, mid, high);
}
}
/**********************************************************/
/* 기 능 : 나누어진 두개의 배열을 합침
/* 인 자 : A[] => 소트할 배열
/* : low => 배열 맨앞 인덱스
/* mid => 자른 배열 인덱스
/* high => 배열 맨뒤 인덱스
/* 리턴값 : 없음
/**********************************************************/
void merge(char A[maxsize], int low, int mid, int high)
{
int i, j;

j = mid + 1; //현재 배열 인덱스 위치를 mid+1 설정

int Temp[maxsize];

/* A 배열의 값을 임시배열로 복사 */
for(i=low; i<=high; i++)
{
Temp[i] = A[i];
}
/*배열 맨앞 인덱스 저장*/
i = low; //임시 배열에 복사후 로우값 i에 저장

/*작은 값을 A배열로 복사(분할배열 교대로)*/
while((low <= mid) && (j <= high)) {
if(Temp[low] <= Temp[j])
{
A[i] = Temp[low];
low = low + 1;
}
else {
A[i] = Temp[j];
j = j + 1;
}
i++;
}
/*오른쪽 분할이 남아있으면 인덱스를 조절*/
/*(복사하기 위해)*/
if(low > mid) {
low = j;
mid = high;
}
/*나머지 값들을 A배열로 복사*/
for(j = low; j <= mid; j++) {
A[i] = Temp[j];
i++;
}
}

익명 사용자의 이미지

int mergeSort(void *arr, size_t size, size_t len, int (*cmp)(void *p1, void *p2)) { ... }

int comp(void *p1, void *p2) { return strcmp(p1, p2); }

char *s[3] = { "one", "two", "three" };

mergeSort(s, sizeof(s[0]), 3, comp);

익명 사용자의 이미지

int comp(void *p1, void *p2) { return strcmp(*(char **)p1, *(char **)p2); }

익명 사용자의 이미지

있는 소스를 님께서 올려주신 걸로 수정해볼려고 했으나
워낙 기본이 부족한 관계로....포기상태에 이르렀습니다.
역시 프로그램은 어렵군요 -_-
답변 감사드려요

hey의 이미지

숫자로는 정렬을 하셨다면 :]
숫자와 문자의 차이는 비교부분 뿐입니다. 숫자를 비교하는 부분에 strcmp를 넣으시면 되겠죠.


----------------------------
May the F/OSS be with you..


Fe.head의 이미지

위의

void merge_sort(char A[], int low, int high); /* 머지소트 함수 선언 */
void merge(char A[], int low, int mid, int high); /* 머지 함수 선언 */ 

함수에서 char A[] 가 아니라.

3중 포인터를 써야 할듯 보이는데요..

char ** a[] 정도 될려나?..

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

acidd15의 이미지

질문 게시판에 질문해 주세요 --;;프로그래밍 qna로

sh.의 이미지

아침부터 이 쓰레드가 계속 메인에 떠서.....
이 글 제목이 자꾸

문자열을 오름차순으로 소개팅하는건데여...잘안되네요... 도와주

로 보여요 :oops:

acidd15의 이미지

제가 보기엔 이글은 코드를 자랑한다기 보다는 질문성향이 강한데 어째서 계속 놔두는지 궁금하네요..

정 이곳에 글을 올리시고 싶다면 질문게시판에 질문한다음 문제점 수정하고 미완의 코드를 어느정도 완성의 코드로 만든다음 이곳에 코드를 자랑하시기 바랍니다.

ed.netdiver의 이미지

에, 그... 질문성 글인점도 조금은 머시기하긴 하지만,
또한 꼭 제법 갖춘상태의 코드를 자랑하는 용도만은 아니었던것 같습니다만...
그냥 공부하다 작성한 테스트코드들도 마구 올려보고 이런저런
이야기도 나누는 그런 곳을 생각했었더랬습니다.
심지어는 돌지 않는 코드조차도 얘깃거리가 되는...

코너 제목 밑의 설명에 "자랑"이라는 단어가 들어있어서 조금은
우려가 있기는 했지만서도, 개설하신 순선님의 의견은 정확히 몰라도,
처음 발제한 의견은 beginner및 중급미만의 분들이 자유롭게
코드로 수다떠는 모습을 바랬습니당^^;
아 물론 고급프로그래머분들을 배제한것은 아닙니다만, 실제로는
엄청난 실력의 분들만 posting해주셔서 좋기도 하고 주눅들기도 하는군요^^;

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

익명 사용자의 이미지

그렇담 프로그램qna와의 경계가 모호해 지지 않나요? 질문을 올리게 한다는것은 좀..

ed.netdiver의 이미지

Anonymous wrote:
그렇담 프로그램qna와의 경계가 모호해 지지 않나요? 질문을 올리게 한다는것은 좀..

제가 이런 댓글 올릴 자격은 당근 없지만, 몇자 적습니당^^;

에, 사실 순선님의 명확하고 구체적인 의도는 저도 잘 모르겠습니다.

우선 이 코너에는 관리자가 할당되어있지 않습니다.
옆방들엔 다 표시되어있습니다만...
물론 그렇게 명시적인 표시가 안되어있다는 것이 기존 관리자분들이
이곳을 관리(쓰레드 이동같은...) 할수 없다는 건지는 저도 잘 모릅니다.
어쨌든 적어도 지금까지는 그런 관리자 개입이 없었다는 점을
말씀드리는겁니다.

qna부분은 저도 좀 머시기하긴 합니다.
이 쓰레드를 개설하신 분의 의도는 분명 질문이었고, 저도 이 쓰레드는
qna쪽이 합당할것 같습니다.
그쪽이 훨씬 더 활성화되어있으니 답변받기도 수월하셨을테구요.
하지만, 그렇게 하지 않으셨죠. 그럼 그건 그분의 자유의사로 봐야하지
않나 싶은정도가 제 의견입니다.

본 코드놀이터 게시판은 개시한지 얼마 안되기도 했지만,
제가 상상했던 모습까지는 아직 좀 안된건 사실입니다.
(그렇다고 오해는 하지 말아주세요. 끈적이에 보시면 아시겠지만,
전 그냥 막연한 상상으로 제안을 한것일뿐, 이 게시판의 개설과
운영, 진행방향과 같은 공적 담론이 담보되어야 하는 부분에 있어서는
전혀 무관한 일개 user일뿐입니다. 보시면 아시겠지만...)

하지만, 그냥 참여하는 사람중 하나로서 생각할때는,
좀더 열린공간이었으면 하는 바램은 있습니다.
처음 개설의 제안을 할때도 그랬지만, 다른 게시판들과 구분선을
명확히 짓기 모호한 부분들이 있습니다.
정체성을 획득하기 어렵다는 뜻도 되지만, 그건 그만큼 자유도를
높이자는 의미였던 겁니다.

이런 예가 적당할지 모르겠으나, 저는 아이들 놀이방정도를
생각했습니다.
놀이방이 놀이만 하는곳이 아니라 교육, 육아, 취침, 놀이, 예능등
다양한걸 취급하죠? 그렇다고 그중 어느 한 분야만을 집중부각해서
이곳은 어떤곳이다라고 규정하기는 쉽지 않죠.
말하자면, 고수분들이 엄청 많은 kldp에서 입문자, 수련자들이
자유롭게 사유하는 공간이라는 정도의 목적성만 갖춘다면,
글이 질문형태든, 안도는 코드를 가지고 뻥을 치는 장난 형태든,
책 코드를 타이핑한거든, 멋진 코드를 자랑하든 괜찮지 않겠냐 싶은게
제 안일한 의견입니당^^;;

실은, 이곳에 글을 올리는건 심지어 자게에 올리는것보다 부담스럽습니다. 어찌되었든, 끈적이에 보셨듯 처음 제안한 게 저이고,
그게 며칠만에 후딱 실현되어버렸으니까요.(전 좀 오래 시간을 두고
논의가 이어진 후에 심사숙고를 거쳐 될줄 알았는데, 순선님의
용단으로^^;)
그 뒤로 썰렁함이 계속되는데, 제가 장난질을 하던, 책 코드를 베끼던
그런게 어째 저혼자서 휘젓고 다니는 형국인것처럼 비쳐질까봐
우려되었던겁니다.(이글도 몇번 고쳐쓰고 있습니당^O^//)

주저리 길게 적었지만, 어찌되었건, 전 지금 이 게시판은 아직
settling되려면 좀더 시간이 걸릴거로 생각하고, 그 과정의 시행착오는
당연할거라 보며, 질문이나 snippet에 어울릴 내용들이라고 할지라도
발전해나가는 과정상에서 묵살하지는 말았으면 좋겠습니다.

무엇보다 이곳은 놀이터니까요...^^;;

끝까지 읽어주셔서 감사합니다.
그럼 좋은 하루하루 되세용~~~

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

cromkhc의 이미지

acidd15님 저두 바로 지울려고 했습니다
올리고 서도 부끄럽다는 생각을 했습니다.
아는 사람소개로 들어와봤지만... 님들이 보기에 문제같지도 않은문제
올려서 죄송하고, 왜 나두는지 궁금하다구요?
별로 안궁금해 하셔도 됩니다. 심히 불쾌하네요....
참나...

그나저나 삭제버튼은 어디있는지..원...

권순선의 이미지

이 글이 코드놀이터 게시판에 올라와 있는 것은 봤지만 질문성인줄은 몰랐습니다. 그래서 방금 이 글을 이곳으로 옮겼고, 게시판 관리자도 지정하여 두었습니다. 게시판 관리자를 지정하지 않은 것은 처음에 게시판 개설하면서 지정해 두었어야 했는데.... 단순한 실수입니다. -_- 오해 없으시기 바랍니다....

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.