c언어 라이브러리에 qsort 함수 질문!

sunpark20의 이미지

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를 이용해서 할 수 있다고 들었는데 까먹고 못 찾겠네요 ㅠㅠ..

물론 퀵솔트의 방식을 이해하면 어떻게 할 수 있을 것 같은데 지금 빨리 쓰고 싶어서 질문드려요~

raymundo의 이미지

글쎄요... 라이브러리에 있는 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] ];
}

좋은 하루 되세요!

shint의 이미지


이상해요.
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

raymundo의 이미지

갸웃갸웃하면서 보다보니, 본문 질문과는 무관한 얘기였군요.

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;

좋은 하루 되세요!

shint의 이미지

근데. 짱구 성우분 목소리로 들립니다. ㅡ_ㅡ;;;

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.