c언어 라이브러리에 qsort 함수 질문!
글쓴이: sunpark20 / 작성시간: 수, 2012/12/05 - 6:33오후
qsort 를 이용해서 배열 하나가 아니라 여러개? 를 정리하고 싶어요
qosrt의 기본적인 사용법을 배웠습니다
qsort(시작위치,전체길이,하나길이, 비교함수 )
qsort 를 이용해서 배열 하나가 아니라 여러개? 를 정리하고 싶어요 이 말이 이해가 잘 안되실텐데 //
예를 들어서 a[5]의 값이 4,3,1,1,2 이고
b[5]의 값이 3,5,3,7,8 이면
a순으로 정리를 하면 b의 값도 같이 따라오는 식으로
정렬 후
a 1,1,2,3,4
b 3,7,8,5,3
그리고 만약 a가 같다면 b의 오름차순으로 정렬하기 .
이런것들을 하고 싶은데 .. 버블소트에서 밖에 못하겠네요 .. ㅠ.ㅠ
옛날에 qsort를 이용해서 할 수 있다고 들었는데 까먹고 못 찾겠네요 ㅠㅠ..
물론 퀵솔트의 방식을 이해하면 어떻게 할 수 있을 것 같은데 지금 빨리 쓰고 싶어서 질문드려요~
Forums:


글쎄요... 라이브러리에 있는 qsort에는
글쎄요... 라이브러리에 있는 qsort에는 비교함수는 지정해 줄 수 있지만 스왑은 어쨌거나 인자로 주어진 배열밖에 못 하니까,
애초에 소트 과정 중에 a와 b배열을 동시에 스왑하려면 그렇게 퀵소트를 구현해야만 하지 않으려나요?
제가 생각하는 최선은
// 일단 a 배열의 인덱스를 의미하는 배열 하나를 만들고 int idx[] = { 0,1,2,3,4 }; // 이제 이 idx 배열을 정렬하되, 정렬용 비교 함수는 idx 배열의 두 원소 i,j가 있을 때 // a[i]와 a[j]를 비교하도록 구현하면 qsort(idx,...); // idx 배열은 { 2,3,4,1,0 } 이 되어 있겠죠. // 이제는 a든 b든 저 idx 배열에 있는 원소들을 인덱스로 해서 정리하면 원하는 정렬이 되겠네요. for (i=0부터 4) { new_a[i] = a[ idx[i] ]; new_b[i] = b[ idx[i] ]; }좋은 하루 되세요!
이상하지만 되네요
이상해요.
strcmp로 비교하여 나온 리턴값으로 하면. 잘 됩니다. 왜 되는지 아시는분 설명점 해주세요.
int fn(const void* a, const void* b) { //이상하게 이건 안되네요. // if((char*)a > (char*)b) // { // return (int)(char*)a; //// return 1; // } // else // { // return (int)(char*)b; // } // return 0; // return (int)(char*)b; //이상하게 이건 잘됩니다. //http://ra2kstar.tistory.com/174 int n = strcmp( (char*)a , (char*)b ); return n; } void main() { char ca[10][10]; memset(ca, '\0', 100); int i=0; int j=0; for(i=0; i<10; i++) { for(j=0; j<10; j++) { ca[i][j] = rand()%10; } } for(i=0; i<10; i++) { TRACE("\n id:%d ", i); for(j=0; j<10; j++) { TRACE("%d ", ca[i][j]); } } TRACE("\n---------------------------\n"); //qsort(시작위치, 전체길이, 하나길이, 비교함수 ) for(i=0; i<10; i++) { // for(j=0; j<10; j++) { qsort(&ca[i], 10, 1, fn); } } for(i=0; i<10; i++) { TRACE("\n id:%d ", i); for(j=0; j<10; j++) { TRACE("%d ", ca[i][j]); } } TRACE("\n---------------------------\n"); } //출력 결과 // id:0 1 7 4 0 9 4 8 8 2 4 // id:1 5 5 1 7 1 1 5 2 7 6 // id:2 1 4 2 3 2 2 1 6 8 5 // id:3 7 6 1 8 9 2 7 9 5 4 // id:4 3 1 2 3 3 4 1 1 3 8 // id:5 7 4 2 7 7 9 3 1 9 8 // id:6 6 5 0 2 8 6 0 2 4 8 // id:7 6 5 0 9 0 0 6 1 3 8 // id:8 9 3 4 4 6 0 6 6 1 8 // id:9 4 9 6 3 7 8 8 2 9 1 //--------------------------- // // id:0 0 1 2 4 4 4 7 8 8 9 // id:1 1 1 1 2 5 5 5 6 7 7 // id:2 1 1 2 2 2 3 4 5 6 8 // id:3 1 2 4 5 6 7 7 8 9 9 // id:4 1 1 1 2 3 3 3 3 4 8 // id:5 1 2 3 4 7 7 7 8 9 9 // id:6 0 0 2 2 4 5 6 6 8 8 // id:7 0 0 0 1 3 5 6 6 8 9 // id:8 0 1 3 4 4 6 6 6 8 9 // id:9 1 2 3 4 6 7 8 8 9 9 //-------------------------------------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
갸웃갸웃하면서 보다보니, 본문 질문과는 무관한
갸웃갸웃하면서 보다보니, 본문 질문과는 무관한 얘기였군요.
strcmp 도 뭐 결국은 두 문자열의 같은 자리끼리 코드값 숫자를 비교하는 거니까, char 배열을 정렬하는 데 비교함수로 쓰여서 성공하는 게 별 이상하진 않죠.
다만 strcmp의 특성상,
만일 a와 b주소에 저장된 값이 같다면 그 다음 번지에 있는 값들을 비교하면서 (널캐릭터 만날 때까지) 진행할테니, 아주 운이 없으면 배열 범위를 벗어나서 검사하다가 죽을 수도 있겠군요.
그리고 안 된다고 하신 코드의 경우는
a와 b가 아니라 *a와 *b를 비교하셔야겠죠.
그리고 return 값은 음수,0,양수 여야지 지금처럼 하시면 a나 b나 다 양수겠네요.
if(*((char*)a) > *((char*)b)) { return 1; } else if(*((char*)a) < *((char*)b)) { return -1; } return 0;좋은 하루 되세요!
잘되네요.
근데. 짱구 성우분 목소리로 들립니다. ㅡ_ㅡ;;;
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기