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-1
和 findLargest(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;
}
该程序应该获取一个数组,并将其从最低值到最高值排序。我的程序不会对任何值进行排序。我认为错误出在 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-1
和 findLargest(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;
}