C:通过加法交换不能正常工作但通过引用交换可以吗?
C: swapping by addition not working correctly but swapping by reference is?
我试图在 C 中实现快速排序算法,但是当我尝试使用以下代码片段(我打算这样做)交换元素 x
和 y
时,我不断收到这个奇怪的错误如果我能够解决此问题,请在我的代码中用作宏):
x = x + y; // step 1
y = x - y; // step 2
x = x - y; // step 3
#include <stdio.h>
#include <stdlib.h>
int partition (int *A, int p, int r)
{
int i, j, pivot;
pivot = A[r];
i = (p - 1);
for (j = p; j < r; j++) {
if (A[j] <= pivot) {
i++;
printf ("Before: A[i] = %d, A[j] = %d\n", A[i], A[j]);
A[i] = A[i] + A[j];
printf ("A[i] = %d ", A[i]);
A[j] = A[i] - A[j];
printf ("A[j] = %d ", A[j]);
A[i] = A[i] - A[j];
printf ("A[i] = %d\n", A[i]);
printf ("Finally: A[i] = %d, A[j] = %d\n\n", A[i], A[j]);
}
}
putchar ('\n');
printf ("Before: A[i + 1] = %d, A[r] = %d\n", A[i + 1], A[r]);
A[i + 1] = A[i + 1] + A[r];
printf ("A[i + 1] = %d ", A[i + 1]);
A[r] = A[i + 1] - A[r];
printf ("A[r] = %d ", A[r]);
A[i + 1] = A[i + 1] - A[r];
printf ("A[i + 1] = %d\n", A[i + 1]);
printf ("Finally: A[i + 1] = %d, A[r] = %d\n\n", A[i + 1], A[r]);
return (i + 1);
}
int my_qsort (int *A, int p, int r)
{
int q;
if (p < r && A != NULL) {
q = partition (A, p, r);
my_qsort (A, p, q - 1);
my_qsort (A, q + 1, r);
return 1;
}
return 0;
}
int display (int *arr, int len)
{
int i;
if (len == 0) {
printf ("Array is empty.\n");
return 0;
}
for (i = 0; i < len; i++) {
printf ("%d ", arr[i]);
}
putchar ('\n');
return 1;
}
int main (int argc, char **argv)
{
int i, len = argc - 1;
int arr[len];
for (i = 0; i < len; i++) {
arr[i] = atoi (argv[i + 1]);
}
puts ("Before quick sort:");
display (arr, len);
my_qsort (arr, 0, len-1);
puts ("After quick sort:");
display (arr, len);
return 0;
}
如果这太长了,我深表歉意。我尝试将交换问题隔离为一个最小的工作示例,但它工作正常并且没有出现错误。还有
丑陋的印刷声明是必要的,以说明什么是错误的。这是我 运行 程序的部分输出:
./prg 9 8 7 6 5 4 3 2 1 | less
如您所见,对于 A[i] = 8
和 A[j] = 8
,第 1 步给出 16(正确),但随后
第 2 步和第 3 步产生 0 ??考虑到交换工作,这真的很奇怪
第一次交换正确(标有勾号)。如标题中所述,我尝试使用其他交换方法(例如使用临时变量)并通过
通过传递指针使用函数 swap()
- 它们都有效。这是唯一的
这不起作用的实例。我可能会遗漏一些非常简单的东西,那真的很尴尬。有什么想法吗?
如果 i + 1
等于 r
或 i
等于 j
那么你将有
printf ("Before: A[i + 1] = %d, A[r] = %d\n", A[i + 1], A[r]);
// Before: A{i + 1] = 8, A[r] = 8
A[i + 1] = A[i + 1] + A[r];
// A[i + 1] = 16, A[r] = 16
printf ("A[i + 1] = %d ", A[i + 1])
// A[i + 1] = 16
A[r] = A[i + 1] - A[r];
// A[r] = A[i + 1] = 0
printf ("A[r] = %d ", A[r]);
// A[r] = 0
A[i + 1] = A[i + 1] - A[r];
// A[i + 1] = A[r] = 0
printf ("A[i + 1] = %d\n", A[i + 1]);
// A[i + 1] = 0
printf ("Finally: A[i + 1] = %d, A[r] = %d\n\n", A[i + 1], A[r]);
// Finally: A[i + 1] = 0, A[r] = 0
那是使用您的交换方法,您不能将对象与其自身交换。
我试图在 C 中实现快速排序算法,但是当我尝试使用以下代码片段(我打算这样做)交换元素 x
和 y
时,我不断收到这个奇怪的错误如果我能够解决此问题,请在我的代码中用作宏):
x = x + y; // step 1
y = x - y; // step 2
x = x - y; // step 3
#include <stdio.h>
#include <stdlib.h>
int partition (int *A, int p, int r)
{
int i, j, pivot;
pivot = A[r];
i = (p - 1);
for (j = p; j < r; j++) {
if (A[j] <= pivot) {
i++;
printf ("Before: A[i] = %d, A[j] = %d\n", A[i], A[j]);
A[i] = A[i] + A[j];
printf ("A[i] = %d ", A[i]);
A[j] = A[i] - A[j];
printf ("A[j] = %d ", A[j]);
A[i] = A[i] - A[j];
printf ("A[i] = %d\n", A[i]);
printf ("Finally: A[i] = %d, A[j] = %d\n\n", A[i], A[j]);
}
}
putchar ('\n');
printf ("Before: A[i + 1] = %d, A[r] = %d\n", A[i + 1], A[r]);
A[i + 1] = A[i + 1] + A[r];
printf ("A[i + 1] = %d ", A[i + 1]);
A[r] = A[i + 1] - A[r];
printf ("A[r] = %d ", A[r]);
A[i + 1] = A[i + 1] - A[r];
printf ("A[i + 1] = %d\n", A[i + 1]);
printf ("Finally: A[i + 1] = %d, A[r] = %d\n\n", A[i + 1], A[r]);
return (i + 1);
}
int my_qsort (int *A, int p, int r)
{
int q;
if (p < r && A != NULL) {
q = partition (A, p, r);
my_qsort (A, p, q - 1);
my_qsort (A, q + 1, r);
return 1;
}
return 0;
}
int display (int *arr, int len)
{
int i;
if (len == 0) {
printf ("Array is empty.\n");
return 0;
}
for (i = 0; i < len; i++) {
printf ("%d ", arr[i]);
}
putchar ('\n');
return 1;
}
int main (int argc, char **argv)
{
int i, len = argc - 1;
int arr[len];
for (i = 0; i < len; i++) {
arr[i] = atoi (argv[i + 1]);
}
puts ("Before quick sort:");
display (arr, len);
my_qsort (arr, 0, len-1);
puts ("After quick sort:");
display (arr, len);
return 0;
}
如果这太长了,我深表歉意。我尝试将交换问题隔离为一个最小的工作示例,但它工作正常并且没有出现错误。还有 丑陋的印刷声明是必要的,以说明什么是错误的。这是我 运行 程序的部分输出:
./prg 9 8 7 6 5 4 3 2 1 | less
如您所见,对于 A[i] = 8
和 A[j] = 8
,第 1 步给出 16(正确),但随后
第 2 步和第 3 步产生 0 ??考虑到交换工作,这真的很奇怪
第一次交换正确(标有勾号)。如标题中所述,我尝试使用其他交换方法(例如使用临时变量)并通过
通过传递指针使用函数 swap()
- 它们都有效。这是唯一的
这不起作用的实例。我可能会遗漏一些非常简单的东西,那真的很尴尬。有什么想法吗?
如果 i + 1
等于 r
或 i
等于 j
那么你将有
printf ("Before: A[i + 1] = %d, A[r] = %d\n", A[i + 1], A[r]);
// Before: A{i + 1] = 8, A[r] = 8
A[i + 1] = A[i + 1] + A[r];
// A[i + 1] = 16, A[r] = 16
printf ("A[i + 1] = %d ", A[i + 1])
// A[i + 1] = 16
A[r] = A[i + 1] - A[r];
// A[r] = A[i + 1] = 0
printf ("A[r] = %d ", A[r]);
// A[r] = 0
A[i + 1] = A[i + 1] - A[r];
// A[i + 1] = A[r] = 0
printf ("A[i + 1] = %d\n", A[i + 1]);
// A[i + 1] = 0
printf ("Finally: A[i + 1] = %d, A[r] = %d\n\n", A[i + 1], A[r]);
// Finally: A[i + 1] = 0, A[r] = 0
那是使用您的交换方法,您不能将对象与其自身交换。