2010-03-21 5 views
1

내 방법에 어떤 문제가 있는지 말해 줄 수 있습니까? 나는 모든 것을 끝내고 실제로는 정렬하지 않는다.C++ 정렬 문자 포인터 배열

void sortArrays(){ 

    int i, j; 



    for(i=0; i<counter; i++){ 



     for(j=0; j<i; j++){ 

      if(strcmp(title_arr[i], title_arr[j]) < 0){ 

       char* title_temp = title_arr[i]; 

       title_arr[j] = title_temp; 





      } 

     } 

    } 
+0

왜'qsort' 나'std :: sort'를 사용하지 않으시겠습니까? – vava

+1

제공된 표준 알고리즘을 사용하는 대신 자신의 롤업을 시도 할 때 발생하는 현상입니다. 어리석은 작은 버그를 소개하는 것은 너무 쉽습니다. –

답변

10

이 :

title_arr[j] = title_arr[i]; 

당신이 그 (것)들을 교환하지, 당신은 단지 다른 하나의 복사

char* title_temp = title_arr[i]; 

title_arr[j] = title_temp; 

은 동일합니다. 다음 행을 추가해야합니다.

title_arr[i] = title_arr[j]; 

그렇게하면 [i][j]으로 덮어 쓰 겠지만 의 이전 값을 여전히 보유하고 있으므로 [j]에 복사하여 교환 할 수 있습니다.

알고리즘에 대한 강의 시간이기도합니다. 귀하의 알고리즘은 "bubble sort" 알고리즘으로 알려져 있습니다. 단순함으로 알려져 있지만 현실적인 상황에서는 비효율적 인 것으로 알려져 있습니다 (기술 용어는 "suh sux"이고 실제 기술 용어는 O(n^2) ("N 제곱") 성능 임). 좀 더 일반적인 (보다 효율적인) 알고리듬은 Quicksort, merge sortHeapsort을 포함합니다. 알고리즘 확장 성 측정에 대한 자세한 내용은 Big Oh notation의 기사를 참조하십시오. *

그러나 메모에 설명 된대로 할당이 자신의 정렬 기능을 작성하지 않으면 qsort으로 더 나은 성능을 얻을 수 있습니다 C에서) 또는 std::sort (C++에서).

int mystrsort(const void *a, const void *b) 
{ 
    return strcmp(*(const char **)a, *(const char **)b); 
} 

// later: 
qsort(title_arr, sizeof title_arr/sizeof(char *), sizeof(char *), mystrsort); 

내가 std::sort에 찔러 않을거야,하지만 그것을 (쉽게 아마도) 같은에 대해 작업 할 것입니다. **

*가 좋아하는 사람이 이러한 위키 백과 링크를 자유롭게 변경할 수 있음을 유의 스택 오버플로 링크. 내가 더 빨리 필요한 정보를 찾는 방법을 알고 있었기 때문에 SO에 링크하는 것이 더 좋을 것입니다. Wikipedia에 연결했습니다.
** 좋아하는 사람은 누구나 std::sort 예를 자유롭게 추가 할 수 있습니다. 나는 C++에 익숙하지 않다.

+0

고마워 ... 그래,이 잘 작동. – user69514

+0

@ user69514 - 더 중요하게, 당신은 그것을 이해합니까? –

2

제대로 스왑되지 않았으므로 작동하지 않습니다.

#include <iostream> 
#include <algorithm> 

int const counter = 4; 
char * title_arr[counter] = { 
    "d", "c", "b", "a" 
}; 

void sortArrays(){ 
    for(int i = 0; i < counter; i++){ 
     for(int j = 0; j < i; j++){ 
      if(strcmp(title_arr[i], title_arr[j]) < 0){ 
       char* title_temp = title_arr[i]; 
       title_arr[i] = title_arr[j]; 
       title_arr[j] = title_temp; 
       //you wouldn't have made that stupid mistake this way. 
       //std::swap(title_arr[i], title_arr[j]); 
      } 
     } 
    } 
} 

int compare(void const * a, void const * b) { 
    return strcmp(static_cast<char const *>(a), static_cast<char const *>(b)); 
} 

struct StringLess : public std::binary_function<char const *, char const *, bool> { 
    bool operator() (char const * a, char const * b) const { 
     return strcmp(a, b) < 0; 
    } 
}; 

int main(int argc, char * argv[]) 
{ 
    sortArrays(); 
    //those ones better 
// qsort(title_arr, counter, sizeof(char *), compare); 
// std::sort(title_arr, title_arr + counter, StringLess()); 
    for (int i = 0; i < counter; i++) { 
     std::cout << title_arr[i] << ", "; 
    } 
    return 0; 
} 
1

나쁜 코딩 스타일 :
1. 전역 변수를 사용하지 마십시오. 배열과 길이를 인수로 정렬 함수에 전달하는 것이 좋습니다. 왜? 귀하의 기능은 재사용 할 수 없습니다. 다른 배열을 정렬해야한다면? 예, 다른 정렬 함수를 작성해야합니다 ...
2. 고급 팁 : 고차 함수의 에뮬레이션을 사용하십시오. 캐릭터를 분류 할 필요가 있다면 어떨까요? 정수, 수레, 문자열 또는 자신의 유형. 이 경우 compare() 함수를 배열의 객체를 비교할 수있는 정렬 함수로 전달할 수도 있습니다.