2015-10-04 72 views
1

該程序應該採用一個數組,並將其從最低值排序到最高值。我的程序不會排序任何值。我相信這個錯誤是在selectionSort中。值i和j存在於函數中,我將它們打印在函數內部,但它們不會傳遞到交換函數中。我試圖讓我和j指針,但它沒有工作。我不知道下一步該怎麼做。任何幫助,將不勝感激。C程序,通過指針進行函數排序

#include <stdio.h> 
#define N 5 

void selectionSort(int *a, int n); 
int *findLargest(int *a, int n); 
void swap(int *p, int *q); 

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

    printf("Enter %d numbers: ", N); 
    for (i = 0; i < N; i++) { 
     scanf("%d", &a[i]); 
    } 

    selectionSort(a, N); 

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

    return 0; 
} 

void selectionSort(int *a, int n) 
{ 
    int *p = a; 
    int i; 
    int j; 

    if (n == 1) { 
     return; 
    } 

    i = *(p+n-1); 
    j = *findLargest(a, n); 
    swap(&i, &j); 

    selectionSort(a, n - 1); 
} 

int *findLargest(int *a, int n) 
{ 
    int *p; 
    int *p_max = a; 

    for(p = a + 1; p < a + n - 1; p++) { 
     if (*p > *p_max) 
      p_max = p; 
    } 
    return p_max; 
} 

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

如果您還沒有試過使用調試器,現在是瞭解如何使用調試器的最佳時機。有了它,您可以逐行瀏覽代碼,進入或跳過函數調用,並監視變量及其值。使用調試信息構建程序的一個版本,並在調試器中運行以幫助您找到問題。知道如何使用調試器是非常重要的,如果你想認真對待編程,因爲它是更大的「編程」圖片的重要組成部分。 –

+0

哦,對於任何指針或數組'a'和整數'i',表達式*(a + i)'相當於'a [i]'。除了少寫點外,它在大多數情況下還能更好地使代碼更易於閱讀,理解和維護。 –

回答

1

的問題是在你的swap電話:你換兩個局部變量

int i; 
int j; 
... // Some other code, then 
swap(&i, &j); 

這具有原始陣列沒有影響的內容。你應該通過p+n-1findLargest(a, n)直接或存儲他們的結果指針,而不是在int S:

swap(p+n-1, findLargest(a, n)); 

此外,您swap壞:而不是交換兩個指針的內容,它假定p點一個元素通過目標位置。這是對通用函數(如swap)做出的錯誤假設,並且還會導致程序中出現未定義的行爲。

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