【发布时间】:2016-06-25 08:05:03
【问题描述】:
该程序用于使用重复键进行快速排序。代码完美运行一次或两次,然后即使列表不为空,下次也会给出 IndexError。当我打印索引时它们位于范围内。这是我的问题吗具体是电脑?
EDIT-添加回溯
import random
def partition(n,lo,hi):
i=lo
lt=lo #index showing the start of all duplicate partitioning keys
gt=hi #index showing the end of all duplicate partitioning keys
x=n[lt]
while(i<=gt):
while(n[i]<=n[lt] and i<=gt):
if(x!=n[lt]):
print("alert!!!")
if(n[i]<n[lt]): #current alement not a duplicate of partitioning alement
if(lt<=i):
n[lt],n[i]=n[i],n[lt]
#print(n)
i+=1
lt+=1
else: #current element is a duplicate partitioning alement
#print(n[i],"=",n[lt])
i+=1
while(n[gt]>n[lt] and i<=gt):
gt-=1
if(i<gt):
n[i],n[gt]=n[gt],n[i]
gt-=1
#print(n)
return gt
def quickSort(n,lo,hi):
#print("called")
if(lo<hi):
print(n)
p=partition(n, lo, hi)
quickSort(n, lo, p-1)
quickSort(n, p+1, hi)
def main():
nums=[]
for i in range(30):
nums.append(random.randrange(100))
print("original array")
print(nums)
k=4
hi=len(nums)-1
#print(k,"th lowest number is ",quickSelect(nums, 0,hi,k))
print(nums)
quickSort(nums,0,hi)
print(nums)
if __name__ == "__main__":
main()
追溯:
Traceback (most recent call last):
File "C:\Users\S.reddy\workspace\sorter\src\selector\quickSelect.py", line 59, in <module>
main()
File "C:\Users\S.reddy\workspace\sorter\src\selector\quickSelect.py", line 55, in main
quickSort(nums,0,hi)
File "C:\Users\S.reddy\workspace\sorter\src\selector\quickSelect.py", line 43, in quickSort
quickSort(n, p+1, hi)
File "C:\Users\S.reddy\workspace\sorter\src\selector\quickSelect.py", line 41, in quickSort
p=partition(n, lo, hi)
File "C:\Users\S.reddy\workspace\sorter\src\selector\quickSelect.py", line 11, in partition
while(n[i]<=n[lt] and i<=gt):
IndexError: list index out of range
【问题讨论】:
-
电脑不可能有问题。
-
请也发布回溯
-
n, lo, hi的哪些值会导致问题? -
@RoryDaulton 我不知道我打印的所有这些似乎都在范围内
-
我猜这是一个短路问题(也就是说,你没有正确地短路,当你应该这样做时)。尝试使用
and颠倒您正在测试的条件的顺序:while(i<=gt and n[i]<=n[lt])。这样,如果i大于gt(因此超出范围),它将在尝试查找n[i]之前被注意到。
标签: python