2016-09-26 69 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

代碼中有兩個錯誤。 之一,在find_largest功能邏輯:

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; 

} 

另一種是與交換功能指針:

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。