2014-10-18 7 views
0
void sort(loc_sos_t a[], int array_size) 
{ 
int i, j; 
double index; 
loc_sos_t index_block; 
for (i = 1; i < array_size; i++){ 

    index = a[i].sos; 
    index_block= a[i]; 
    for (j = i; j > 0 && a[j-1].sos > index; j--){ 
     a[j].sos = a[j-1].sos; 
    } 

    a[j].sos = index; 
    a[j]= index_block; 
} 
} 

이 코드 단편은 구조체와 정수를 인수로 사용하기로되어 있습니다. 구조체는 배열입니다. 각 인덱스에서 구조체에는 x, y 좌표 및 와트 값이 포함됩니다. 스 니펫은 와트 값을 오름차순으로 정렬하고 해당 x, y 좌표를 새 위치로 가져옵니다.은 구조체에서 데이터 정렬을 시도했지만 올바르게 정렬되었지만 마지막 행 하나가 잘못되었습니다.

input 
30.0 meters east, 70.0 meters north, power 0.0045 watts 
53.0 meters east, 63.0 meters north, power 0.0006 watts 
36.5 meters east, 27.0 meters north, power 0.0005 watts 
70.0 meters east, 25.0 meters north, power 0.0015 watts 
20.0 meters east, 50.0 meters north, power 0.0008 watts 

output 
36.5 meters east, 27.0 meters north, power 0.0005 watts 
53.0 meters east, 63.0 meters north, power 0.0006 watts 
20.0 meters east, 50.0 meters north, power 0.0008 watts 
70.0 meters east, 25.0 meters north, power 0.0015 watts 
30.0 meters east, 70.0 meters north, power 0.0045 watts 

wrong output generated by wrong code 
36.5 meters east, 27.0 meters north, power 0.0005 watts 
53.0 meters east, 63.0 meters north, power 0.0006 watts 
20.0 meters east, 50.0 meters north, power 0.0008 watts 
70.0 meters east, 25.0 meters north, power 0.0015 watts 
20.0 meters east, 50.0 meters north, power 0.0045 watts 

출력물의 마지막 줄이 잘못되었습니다. 도와주세요. 왜 한 줄만 잘못되었는지 나는 모른다.

+0

안 인덱스 시작? – radar

+0

두 번째 항목을 첫 번째 항목과 비교합니다. 그래서 내가 0에서 시작할 경우 인덱스 -1과 비교할 수 없다. 존재하지 않기 때문이다. –

답변

1

배열 값의 복사본에 대한 최소한의 수정하여 삽입 정렬 코드입니다 (논리가 옳다, 당신은 단지 배열의 요소의 사본을 엉망)

어쨌든, 당신은 표준 라이브러리에서 더 효율적 qsort을 사용할 수 있습니다 : I = 0

int cmplocsos(const void *p1, const void *p2) { 
    double s1 = ((loc_sos_t*)p1)->sos; 
    double s2 = ((loc_sos_t*)p2)->sos; 
    return (s1 > s2) - (s1 < s2); 
} 

qsort(&arr[0], array_size, sizeof(loc_sos_t), cmplocsos); 
+0

정말 고마워요! qsort가 나를 위해 너무 앞서 보였기 때문에 나는 덜 효율적인 수정 된 함수를 사용할 것이다. 그래도 감사합니다. 이 프로젝트가 끝나면 돌아가서이 qsort가 어떻게 작동하는지 배우게 될 것입니다. 정말 고맙습니다! 당신은 변하지 않는 놀라운 사람입니다. –

1

코드는 논리적으로 올바르지 않습니다. 반복마다 출력을 보면; 다음과 같은 결과가 나옵니다.

53.000000 63.000000 0.000600 
53.000000 63.000000 0.004500 
36.600000 27.000000 0.000500 
70.000000 25.000000 0.001500 
20.000000 50.000000 0.000800 
---------------------------- 
36.600000 27.000000 0.000500 
53.000000 63.000000 0.000600 
36.600000 27.000000 0.004500 
70.000000 25.000000 0.001500 
20.000000 50.000000 0.000800 
---------------------------- 
36.600000 27.000000 0.000500 
53.000000 63.000000 0.000600 
70.000000 25.000000 0.001500 
70.000000 25.000000 0.004500 
20.000000 50.000000 0.000800 
---------------------------- 
36.600000 27.000000 0.000500 
53.000000 63.000000 0.000600 
20.000000 50.000000 0.000800 
70.000000 25.000000 0.001500 
20.000000 50.000000 0.004500 
---------------------------- 

난 당신이 어디 잘못 @hwang hyungchae 쉽게 추측 할 수있다 생각합니다. 다음 코드는 원하는 출력을 생성합니다.

void sort(loc_sos_t a[], int array_size) { 
    int i, j; 
    double index; 
    loc_sos_t index_block; 
    for (i = 1; i < array_size; i++) { 
     index = a[i].sos; 
     index_block = a[i]; 
     for (j = i; j > 0 && a[j - 1].sos > index; j--) { 
      a[j] = a[j - 1]; 
     } 
     a[j] = index_block; 
    } 
} 
:
void sort(loc_sos_t a[], int array_size) 
{ 
    int i, j; 
    double index; 
    struct loc_sos_t index_block; 

    for (i = 0; i < array_size; i++){ 
    index = a[i].sos; 
    for (j = i-1; j > 0 && a[j-1].sos > index; j--){ 
     index_block= a[j-1]; 
     a[j-1]=a[i]; 
     a[i]=index_block; 
    } 
    } 
} 
+0

반복마다 나를 부셔 줘서 고맙다고 감사드립니다. 네, 지금 어디서 잘못 됐는지 보았습니다. D : 정말 고마워요! –

+0

@hghongghyungchae 출력을 정확하게 알아낼 수 없을 때 항상 이러한 문제를 해결하려고 노력하십시오. 그것은 많은 도움이됩니다. :) –