2015-10-04 46 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; 
}