#-*- coding:utf-8 with BOM -*-
def quick_sort(numbers,left,right):
#print("left,right 分别为%d,%d"%(left,right))
if right - left <= 1:
return numbers
temp = numbers[left]
i = left
j = right - 1
while i < j:
while numbers[j] > temp and i < j:
j = j - 1
else:
numbers[i] = numbers[j]
while numbers[i] < temp and i < j:
i = i + 1
else:
numbers[j] = numbers[i]
numbers[i] = temp
quick_sort(numbers,left,i)
#quick_sort(numbers,i+1,right) #问题出在这一行
return numbers
test = [3,7,8,5,1,2,11,5,4]
print(quick_sort(test,0,len(test)))
看了一些相关想自己写一下 XD
问题出在倒数第四个语句,如果把倒数第四个语句注释掉,把 test 数组的第一个数不论给改改成什么数,小于这个数的那部分的顺序总是没毛病的。
我的想法是第一次分组就用数组中的第一个数当做基准,分出比它小的和比它大的两组。然后比它小的那一组,是从坐标 0 到坐标( i-1 ),比它大的一组是坐标(i+1)到坐标(数组长度-1)
因而就有了倒数第五个语句和倒数第四个语句分别对较小组和较大组的处理。但是不知道为什么,较大组的处理总是出错 QAQ
求指点,谢谢
补上报错
D:\python\algorithm>python quick_sort.py
left,right分别为0,9
left,right分别为0,2
left,right分别为0,1
left,right分别为2,2
left,right分别为3,9
Traceback (most recent call last):
File "quick_sort.py", line 28, in <module>
print(quick_sort(test,0,len(test)))
File "quick_sort.py", line 23, in quick_sort
quick_sort(numbers,i+1,right) #问题出在这一行
File "quick_sort.py", line 15, in quick_sort
while numbers[i] < temp and i < j:
KeyboardInterrupt
left,right分别为3,9这一句之后程序应该是陷入死循环一样,但是什么输出都没有,最后被我强行暂停。
我对于进入死循环但是什么输出都没有感到很奇怪,因为我在做这个测试的时候已经把函数块第一个语句的注释符号删掉了,按理来说只要调用了这个函数就一定会有输出。但问题在于,程序像是死循环一样,却始终没输出。。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.