2016-09-26 4 views
1

배열 첨자 대신 포인터를 사용하여 배열을 최소에서 최대로 정렬하려고합니다. 나는 문제가 어디에 있는지 모르지만이 코드를 실행할 때 값은 입력 된 것과 동일한 순서로 반환됩니다. find_largest와 swap 함수는 모두 정확히 말합니다. selection_sort 함수는 for 루프를 사용하여 숫자를 오른쪽에서 왼쪽으로 정렬합니다 (최대에서 최소, 오른쪽에서 왼쪽으로). 나는 잠시 동안 이것에 대해 꼼짝 않고 바라 보았다. 그리고 그것이 잘 작동해야하는 것처럼 보이지만 나는 말했듯이, 어떤 이유로 입력 된 순서대로 숫자가 반환된다. 다음은 내 코드입니다 :포인터를 사용하여 c로 배열 정렬

#include <stdio.h> 

#define N 5        

void selection_sort(int *a, int n); 
int *find_largest(int *a, int n); 
void swap(int *p, int *q); 

int main(void) 
{ 
    int i; 
    int a[N]; 

    printf("Enter %d numbers to be sorted: ", N); 
    for (i = 0; i < N; i++) 
    scanf("%d", (a+i)); 

    selection_sort(a, N); 

    printf("In sorted order:"); 
    for (i = 0; i < N; i++) 
    printf(" %d", *(a+i)); 
    printf("\n"); 

    return 0; 
} 

void selection_sort(int *a, int n) 
{ 
     int i = 0; 
     int *largest; 

     for(i = 0; i < n; i++){ 
       largest = find_largest(a, n-i); 
       swap(largest, a+(n-1-i)); 
     } 

} 

int *find_largest(int *a, int n){ 
     int *p = a; 
     int *largest = p; 
     for(p = a; p < a+n-1; p++){ 
       if(*(p+1) > *p){ 
         largest = (p + 1); 
       } 
     } 
     return largest; 
} 


void swap(int *p, int *q){ 
     int *temp; 
     temp = p; 
     p = q; 
     q = temp; 
} 
+3

, 당신의'스왑() '함수 * *이 말씀하지 않습니다 . 첫 번째로 함수 인자의 값을 바꾸는 것은 함수 밖에서 아무런 효과가 없다. 그러나 더 중요한 것은 스왑하려는 포인터가 아니라 포인터가 가리키는 값입니다. –

+0

[고정 코드] (http://ideone.com/GcM14V) – BLUEPIXY

+0

'swap'에서 실제로는 int temp;를 원합니다. 그런 다음 나머지 코드를 수정하십시오. – jxh

답변

2

코드에는 두 가지 실수가 있습니다.

int *find_largest(int *a, int n){ 
    int *p = a; 
    int *largest = p; 
    for(p = a; p < a+n-1; p++){ 
      if(*(p+1) > *largest){  <---- //here you were checking for *(p) 
        largest = (p + 1); 
      } 
    } 
    return largest; 

} 

다른 하나는 스왑 기능에서 포인터입니다 : 다음 find_largest 기능의 논리적 하나, 반대로

void swap(int *p, int *q){ 
    int temp; 
    temp = *p; 
    *p = *q; 
    *q = temp; 
} 
0

존 볼린저가 코멘트에서 언급 한 바와 같이, 스왑()가 제대로 작동하지 않습니다 - 그것은 않습니다 모든 빠르게 범위를 벗어나 이동 재 할당 포인터입니다. 다음은 작동하는 해당 함수를 다시 작성한 것입니다. 그냥 끼워 넣으면 완벽하게 맞습니다.

void swap(int *p, int *q){ 
     int temp; 
     temp = *p; 
     *p = *q; 
     *q = temp; 
} 

John Bollinger에게 감사드립니다.

관련 문제