C程序,函数通过指针排序

C Program, function sorting through 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;
}

问题出在你对swap的调用中:你交换了两个局​​部变量的内容

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

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

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

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

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