我已经成功测试了我的代码。它使用最后一个元素作为数据透视表。 但是,当我试图计算总数没有。比较,显示不正确的计数。 我正在计算全局变量 tot_comparisons 。
建议,我哪里错了? 我正在制作一些愚蠢的错误吗?
def swap(A,i,k):
temp=A[i]
print "temp is "
print temp
A[i]=A[k]
A[k]=temp
def partition(A,start,end):
pivot=A[end]
pivot_index=start
#pivot=A[end]
for i in range(start,end):
#if A[i]<=pivot:
if A[i]<pivot:
print 'HHHHHHHHHHHHHhh'
swap(A,i,pivot_index)
pivot_index+=1
#swap(A,pivot_index,end)
swap(A,pivot_index,end)
return pivot_index
def quicksort(A,start,end):
global tot_comparisons
if start<end:
pivot_index=partition(A,start,end)
tot_comparisons+=end-start
print "pivot_index"
print pivot_index
print "ENDS"
quicksort(A, start,pivot_index-1)
#tot_comparisons+=end-pivot_index
#quicksort(A, pivot_index, end)
quicksort(A, pivot_index+1, end)
#A=[45,21,23,4,65]
#A=[21,23,19,22,1,3,7,88,110]
#A=[1,22,3,4,66,7]
#A=[1, 3, 7, 19, 21, 22, 23, 88, 110]
#A=[7,2,1,6,8,5,3,4]
temp_list=[]
f=open('temp_list.txt','r')
for line in f:
temp_list.append(int(line.strip()))
f.close()
print 'list is '
#print temp_list
print 'list ends'
tot_comparisons=0
#quicksort(A, 0, 7)
quicksort(temp_list, 0, 9999)
#quicksort(temp_list, 0, len(temp_list))
print 'hhh'
print temp_list
print tot_comparisons
#print A
答案 0 :(得分:2)
我检查了你的快速排序是否有效,尽管它与流行的算法文本中给出的算法略有不同,其中最后一个元素切换到第一个元素,然后进行分区。这可能会改变排序的顺序,这会对比较次数产生影响。
例如,您的代码:
def partition(A,start,end):
pivot=A[end]
pivot_index=start
for i in range(start,end):
if A[i] < pivot:
swap(A,i,pivot_index)
pivot_index+=1
swap(A,pivot_index,end)
return pivot_index
可以切换到:
def partition(A,start,end):
swap(A,start,end)
pivot=A[start]
pivot_index=start + 1
for i in range(start+1,end+1):
if A[i] < pivot:
swap(A,i,pivot_index)
pivot_index+=1
swap(A,pivot_index-1,start)
return pivot_index-1
根据OP的评论进行编辑。
答案 1 :(得分:0)
我建议你在脚本的顶部声明全局变量,检查这个有效的基本示例:
inside = 0
def qsort(l):
global inside
inside += 1
if len(l) <= 1:
return l
pivot = l[-1]
return qsort(filter(lambda x: x < pivot, l[:-1])) + [pivot] + qsort(filter(lambda x: x >= pivot, l[:-1]))
import random
l = [random.randint(0,100) for _ in xrange(100)]
print qsort(l)
print inside
>>> [1, 1, 2, 3, 7, 9, 10, 11, 11, 11, 13, 13, 13, 13, 17, 17, 17, 18, 18, 21, 22, 23, 26, 26, 28, 30, 30, 32, 32, 34, 35, 38, 40, 41, 42, 42, 42, 42, 43, 44, 45, 46, 47, 47, 48, 48, 49, 51, 51, 54, 55, 56, 56, 56, 58, 59, 60, 60, 61, 61, 62, 63, 65, 67, 67, 68, 68, 70, 70, 72, 73, 74, 77, 79, 80, 83, 85, 85, 85, 86, 87, 89, 90, 90, 90, 91, 91, 95, 96, 96, 96, 97, 97, 97, 98, 98, 98, 99, 99, 99]
>>> 135