2017-09-12 32 views
1

我想在python中实现快速排序。问题是如何在数组a中增加/减少i/j的值。我知道我应该写i=i+1,在python中没有像i++这样的东西,但我不明白我应该怎么做。 我是新手,这是我的代码。Python中的QuickSort。在数组中遇到问题

def quicksort(a,lo,hi): 
    if(hi<=lo): 
     return 
    i = lo - 1 
    j = hi 
    v = a[hi] 

    while True: 
     while(a[++i] < v): 
      pass 

     while(v < a[--j]): 
      if(j==lo): 
       break 
     if(i>=j): 
      break 
     t = a[i] 
     a[i] = a[j] 
     a[j] = t 

    t = a[i] 
    a[i] = a[hi] 
    a[hi] = t 
    quicksort(a, lo, i - 1) 
    quicksort(a, i + 1, hi) 

回答

0
在Python

,你不能分配和获得的价值,这是一个有意的限制,以避免问题的拼写错误,找到正确的顺序点......

你没有选择,而不是“模仿”的C-移植代码:

while(a[++i] < v): 
     pass 

    while(v < a[--j]): 
     if(j==lo): 
      break 

(注意,这两个结构产生无限循环,因为:

++i == i 

--j == j 

(采用一元外加任意数量的次元负的偶数次给出了相同的号码,看到Why Don't Two Plus Operators Throw an Error (e.g., 1 + + 2)

所以更改为:

i += 1 
    while(a[i] < v): 
     i += 1 

    j -= 1 
    while(v < a[j]): 
     if(j==lo): 
      break 
     j -= 1 
+0

谢谢你,我很欣赏你的帮助。 – Ntryhard

0

以下构造在Python中的工作方式与在C++中的工作方式不同:

while(a[++i] < v):

还有这样一条:

while(v < a[--j]):

的方式更改代码如下:

def quicksort(a,lo,hi): 
    if(hi<=lo): 
     return 
    i = lo - 1 
    j = hi 
    v = a[hi] 

    while True: 
     i += 1 
     while(a[i] < v): 
      i += 1 
      pass 

     j -= 1 
     while(v < a[j]): 
      j -= 1 
      if(j==lo): 
       break 
     if(i>=j): 
      break 
     t = a[i] 
     a[i] = a[j] 
     a[j] = t 

    t = a[i] 
    a[i] = a[hi] 
    a[hi] = t 
    quicksort(a, lo, i - 1) 
    quicksort(a, i + 1, hi) 
+0

非法?你有没有试图让它运行/编译它?顺便说一句,你的代码并不等同于OP所要的。 –

+0

编译?我们在谈论Python吗? – sophros

+0

我的意思是:语法正确。 –