C程序,通过指针进行功能排序

时间:2015-10-04 12:42:10

标签: c arrays sorting function-pointers

该程序应该采用数组,并从最低值到最高值进行排序。我的程序不会对任何值进行排序。我相信错误在selectionSort中。值i和j出现在函数中,我将它们打印在函数内部,但它们不会传递给交换函数。我尝试制作i和j指针,但它没有用。我不知道接下来该做什么。任何帮助,将不胜感激。

#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;
}

1 个答案:

答案 0 :(得分:1)

问题在于您调用swap:您交换了两个局​​部变量的内容

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

这对原始数组没有影响。您应该直接传递p+n-1findLargest(a, n),或将结果存储在指针中,而不是int中:

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

此外,您的swap已损坏:它假定p指向一个元素超过目标位置,而不是交换两个指针的内容。这是在通用函数中做出的错误假设,例如swap,它也会导致程序中出现未定义的行为。

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