【发布时间】:2015-08-26 04:56:45
【问题描述】:
我试图在 Python 中编写 Quicksort(请参阅问题末尾的完整代码)和在分区函数中我应该交换数组的两个元素(称为 x)。我正在使用以下代码基于 xor 运算符进行交换:
x[i]^=x[j]
x[j]^=x[i]
x[i]^=x[j]
我知道它应该可以工作,因为 xor 运算符(即x^x=0)的幂等性,而且我已经在 Java 和 C 中做了一百万次,没有任何问题。我的问题是:为什么它在 Python 中不起作用? x[i] == x[j](可能是i = j?)时似乎不起作用。
x = [2,4,3,5,2,5,46,2,5,6,2,5]
print x
def part(a,b):
global x
i = a
for j in range(a,b):
if x[j]<=x[b]:
x[i]^=x[j]#t = x[i]
x[j]^=x[i]#x[i] = x[j]
x[i]^=x[j]#x[j]=t
i = i+1
r = x[i]
x[i]=x[b]
x[b]=r
return i
def quick(y,z):
if z-y<=0:
return
p = part(y,z)
quick(y,p-1)
quick(p+1,z)
quick(0,len(x)-1)
print x
【问题讨论】:
-
那么你的问题是什么?你得到错误的输出吗?如果是这样,您应该将其包含在问题中。
-
这 3 行确实有效,所以问题出在其他地方。但正如 paxdiablo 在他的回答中所说,你不应该那样交换。
-
@AnandSKumar 感谢您的提问。我的问题是为什么它不起作用。如果我使用异或交换,我得到 [0, 0, 0, 0, 0, 0, 0, 2, 5, 5, 6, 46],如果我使用注释代码,我得到 [2, 2, 2, 2 , 3, 4, 5, 5, 5, 5, 6, 46]
-
@Cyphase 感谢您的回复,问题就在这里。我使用注释交换,它有效。
-
@user16117,这很奇怪;我没有运行您的确切代码,但
d=[1,2]; d[0]^=d[1];d[1]^=d[0];d[0]^=d[1]对我有用;d将是[2,1]。