2015-10-30 58 views
1

尝试执行快速排序,以列表的第一个元素为关键点。快速排序,第一个元素作为关键点,快速代码检查

已经结束了几个小时,只是找不到我的错误。

def quickSort(aList, l, r): 
    #global count 
    if l < r: 
     swap = l+1 
     for run in range (l+1,r):    
      if aList[l] > aList[run]: 
       aList[swap],aList[run]=aList[run],aList[swap] 
       swap += 1 
      run += 1 
     aList[l],aList[swap]= aList[swap],aList[l] 
     quickSort(aList, l, swap-1) 
     quickSort(aList, swap+1, r) 


testl=[4,6,3,7,2] 
print testl 
quickSort(testl,0,len(testl)-1) 
print testl 

输出是:

[4,6,3,7,2]

[3,6,4,2,7] 任何看到其中i在哪里呢?枢轴元素似乎是在正确的地方,但比IDK :(

+1

为什么有你*甚至不使用*你做了什么样的调试变量的全局声明?!;什么是最短的失败例子? – jonrsharpe

+0

你的意思是计数?我只是没有删除,但..应计算比较的数量..但它没有意义,如果排序甚至没有工作。即使有3个数字,它也不起作用:( – hmmmbob

+0

请阅读[mcve] - 这是一个死的赠品,你没有费心修剪你的代码只需要什么来重新创建问题 – jonrsharpe

回答

0

其他我觉得你的代码无法处理这样的情况:枢轴是少,所有

2 5 3 7 6 

在这种情况下,其他元素如swap一定不能改变(在循环之前改变它),然后我们对其余的元素进行排序,同时你也不需要在循环中增加run,我改变你的代码如下图,现在它可以工作。你写range(l+1,r)你错过了最后一个元素,因为你在调用这样的函数:quickSort(testl,0,len(testl)-1)

def quickSort(aList, l, r): 
    #global count 
    if l < r: 
     swap = l 
     for run in range (l+1,r+1):    
      if aList[l] > aList[run]: 
       swap += 1 
       aList[swap],aList[run]=aList[run],aList[swap] 

      #run += 1 
     aList[l],aList[swap]= aList[swap],aList[l] 
     quickSort(aList, l, swap-1) 
     quickSort(aList, swap+1, r) 
-1

修改你的代码如下

def quickSort(aList, l, r): 
    if l < r: 
    swap = l+1 
    pivot = aList[l] 
    for run in range (l+1,r): 
     if pivot > aList[run]: 
      aList[swap],aList[run] = aList[run],aList[swap] 
      swap+=1 

    aList[l],aList[swap-1] = aList[swap-1],aList[l] 
    quickSort(aList, l, swap-1) 
    quickSort(aList, swap, r) 
return aList 


test = [4,6,3,7,2] 
t = quickSort(test,0,len(test)) 
print t 
+0

所以...你有什么改变,并*为什么*? – jonrsharpe