선택정렬 알고리즘 질문입니다.

nayana의 이미지

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h>

#define N 100

void select_sort( void *base, size_t nelem, size_t width, int ( *fcmp ) ( const void *, const void * ) ); 
int  intcmp( const void *a, const void *b ) ;
 
int main( void ) 
{ 
	char a_sort[N], random[N];
	unsigned int  i;

	printf("입력하세요?\n");
	scanf("%s", random );	
	
	strcpy( a_sort , random );
	select_sort( a_sort, strlen( a_sort ), sizeof( char ), intcmp ); 
	
	for( i = 0; i < strlen( random ) ; i++ )
		printf( "(%d)\t %c\n", i + 1, a_sort[i] );	
 
	return 0; 
} 

void select_sort( void *base, size_t nelem, size_t width, int ( *fcmp ) ( const void *, const void * ) ) 
{ 
	void *min; 
	int  minindex; 
	unsigned int  i, j; 
	min = malloc( width ); 
    
	for ( i = 0; i < nelem - 1 ; i++ ) 
	{ 
		minindex = i; //start 
		memcpy( min, (char *)base + i * width, width ); /* min = a[i] */   
		
		for ( j = i + 1; j < nelem ; j++ ) 
		{ 
			if ( fcmp( min, (char *)base + j * width ) > 0 ) /* if (min > a[j]) */ 
			{ 
				memcpy( min, (char *)base + j * width, width ); /* min = a[j] */ 
				minindex = j; 
			} 
		} 
	
		memcpy(   (char *) base + minindex * width, (char *)base + i * width, width ); 
		//  a[minindex] = a[i] 
 
		memcpy( (char *)base + i * width, min, width ); 
		// a[minindex] = min
	}
	
	free( min ); 
} 
 
int intcmp( const void *a, const void *b ) 
{ 
	return ( *(int *)a - *(int *)b ); 
} 

abcde 라고 입력하면 eabcd
edcba 라고 입력하면 aedcb 라고 나옵니다.
어디가 잘못된것인지?

neogeo의 이미지

맨아래 intcmp 라는 함수에서 char 를 int 로 casting 하여서 문제가 생기는 군요.

프로그램이 뭔가 int sorting 하는녀석을 char 로 고치느라 짬뽕된게 -_- 보이는 듯 합니다.

일단 맨 마지막에 *(int *) 이 내용을 *(char *) 로 고치시면 원하시는 부분은

소팅이 되겠네요

Neogeo - Future is Now.

댓글 달기

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