2010-04-25 2 views
1
#include "stdio.h" 
#include "conio.h" 
#include <iostream> 

using namespace std; 

int main (void) 
{ 
    char my_char[] = "happy birthday"; 

    int i; 

    bool j=false; 
    char my_char_temp[1]; 

    do 
    { 
     for (i=0;i<sizeof(my_char)-2;i++) 
     { 
      j=false; 
      if (my_char[i+1] < my_char[i]) 
      { 
       my_char_temp[0]=my_char[i+1]; 
       my_char[i+1] = my_char[i]; 
       my_char[i] = my_char_temp[0]; 
       j=true; 
      } 
     } 

    }while (j); 

    cout << my_char; 
} 

내가 뭘 잘못하고 있니?간단한 문자열을 C++로 정렬하려고 시도합니다

난 그냥 문자 내에서 문자를 정렬하려고 해요.

출력이 완전히 잘못되었습니다.

+6

"내가 뭘 잘못하고 있니?" (std :: sort를 사용하지 않고 자신 만의 정렬 루틴을 작성하는 이유), 그리고 (b) 잘못된 행동이 여러분이 관찰하고있는 것을 알려줄 필요가 있습니다. –

+1

"단순한 문자"를 선택하는 것이 아니라 다소 사소한 것처럼 보입니다. – Blindy

+1

인구수가 포함됩니까? – Potatoswatter

답변

2

두 글자를 비교할 때마다 j를 false로 재설정합니다.

즉, 두 개의 문자를 바꿔서 배열의 끝에 있지 않으면 문자를 바꿨다는 것을 알 수 있습니다.

j = false; for-loop 안쪽에서 do-loop 안쪽까지.

그리고 일요일 오후 과제물에 엉덩이를 구하기 위해 나 한 병의 잭에게 빚졌습니다.

+0

남성용 또는 일반용입니까? –

2

나는 당신이 등 당신의 sizeof(...) - 2과 함께 구현하기 위해 노력하고 있지만, 무엇을 모르는 당신이 아마이 방법을 수행 할 수 있습니다 싶어 :

#include <iostream> 
#include <algorithm> 

int main() { 
    std::string s("happy birthday"); 
    std::sort(s.begin(), s.end()); 
} 
0

이 루프 내부에 무슨 생각해

당신이 값의 쌍 truej 설정, 스왑 발견하면
for (i=0;i<sizeof(my_char)-2;i++) 

, 당신은 그 루프를 통해 반복 계속하고 다음 반복에 false 다시 j을 설정합니다. 결과적으로 문자열의 나머지 두 문자가 정렬 순서대로 정렬되는 즉시 문자열의 나머지 부분이 정렬되는지 여부에 관계없이 프로그램이 종료됩니다.

대신 문자 쌍을 찾아 교환하는 즉시 i=0에서 다시 시작하고 싶습니다. 가장 간단한 방법은 j = true 행 뒤에 break; 문을 추가하는 것입니다. 이 수정 프로그램을 사용하면 올바르게 작동합니다.

또는 j = false 행을 루프 바깥으로 옮길 수 있습니다. 그러면 약간 다른 방식으로 문제가 해결됩니다.

+0

한 쌍의 문자를 교환하는 순간에 깨고 시작할지 여부는 실제로 중요하지 않습니다. 중요한 관찰은 이것이 Bubble Sort이며 성능상 O (N ** 2)의 성능을가집니다. Quicksort와 같이 성능이 좋은 O (N log N)를 사용하고 싶습니다. –

0

실제로는 아주 가깝습니다. 유일한 문제는

 j=false; 

이 외부 루프에 있어야한다는 것입니다. 즉, j은 내부 루프가 실행될 때마다 지워집니다.

이 수정 프로그램을 사용하면 프로그램이 정상적으로 작동합니다.

그러나 문체 오류는 다른 이야기입니다.

3

sizeof 대신 strlen()을 사용하려고합니다.

+0

좋은 지적! 아마도 다른 사람들이 잡은 주요한 것과는 사소한 오류 일 것입니다. –

0

내가 실수 일 수는 있지만 bubble sort을 시도하는 것처럼 보입니까? 그리고 그가 0 기반의 널 종료 문자열을 사용하고 있기 때문에 sizeof (my_char) -2 인 i는 <이고 null 종결자를 정렬하지 않으려 고합니다.

i 대신 j를 사용하여 내부 루프의 조건을 반복 해보고 작동하는지 확인하십시오.이 실행 시간은 O (n^2)이며 필요한 경우보다 훨씬 빨리 정렬 할 수 있습니다. 또는 boolean을 for 루프에서 do 루프로 이동할 수 있습니다.

for (i=0;i &lt; sizeof(my_char)-2;i++) 
      for (i=0;i<sizeof(my_char)-2;i++) 
     { 

      if (my_char[i+1] < my_char[i]) 
      { 
       my_char_temp[0]=my_char[i+1]; 
       my_char[i+1] = my_char[i]; 
       my_char[i] = my_char_temp[0]; 

      } 
} 
관련 문제