如何解决C: 通过加法交换不能正常工作,但通过引用交换是?
我正在尝试在 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[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[r]);
return (i + 1);
}
int my_qsort (int *A,int r)
{
int q;
if (p < r && A != NULL) {
q = partition (A,p,r);
my_qsort (A,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,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[r]);
// Finally: A[i + 1] = 0,A[r] = 0
那是使用您的交换方法,您不能将对象与自身交换。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。