使用中间值作为轴工作的快速排序(但显示ComAprison的计数不正确)

2024-04-25 23:44:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中使用quicksort对数字。这个必须用中间带作为支点。 我怎么找到中间值? 它是第二大的数字(在一个由3个数字组成的列表中,这三个数字是原始列表的第一个、中间和最后一个元素)

如果列表的长度为偶数(2j),中间的no将是jth元素。在

如果列表的长度是奇数(比如5),中间的编号将是第三个元素

我的代码有效成功了。不过,进行的比较总数不正确(使用变量tot\u compariations找到)

我在干什么?在

1.找到支点(第一个、中间和最后一个元素的中间值)

  1. 用第一个元素替换上面找到的pivot(因为我已经准备好了快速排序的代码,第一个元素作为pivot)

我不需要代码。我已经发布了我的下面是成功的工作(除了总数量的比较部分)。我只需要知道我代码中的错误

def swap(A,i,k):
    temp=A[i]
    print "temp is "
    print temp
    A[i]=A[k]
    A[k]=temp


def find_median(input_list,start,end):
    #print 'input list is'
    #print input_list

    temp_list1=[]
    temp_list1.append(input_list[start])    
    if len(input_list) % 2 ==0:
        middle_element_index=(len(input_list) / 2)-1
        middle_element=input_list[middle_element_index]
        temp_list1.append(middle_element)
    else:
        middle_element_index=len(input_list)/2
        middle_element=input_list[middle_element_index]
        temp_list1.append(middle_element)    
    temp_list1.append(input_list[end])
    temp_list1.sort()
    #print temp_list1
    if len(temp_list1)==3:
        print temp_list1[1]    
        return temp_list1[1]
    elif len(temp_list1)==2:
        print temp_list1[1]    
        return temp_list1[1]
    else:
        print temp_list1[0]    
        return temp_list1[0] 


def partition(A,start,end,median_index):

    swap(A,start,median_index)
    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

def quicksort(A,start,end):
    global tot_comparisons
    if start<end:
        median=find_median(A, start, end)
        median_index=A.index(median)

        pivot_index=partition(A,start,end,median_index)
        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

Tags: 元素middleinputindexelementstarttemplist
1条回答
网友
1楼 · 发布于 2024-04-25 23:44:31

我相信我已经找到了关键问题:find_median获取给定列表的左元素和右元素,然后添加原始列表的中间元素。因此,如果您希望将列表位置排序为5:7,那么可以获取元素5、7和3。最后一个应该是元素6。这可能会迫使你完成额外的分类工作。

中间元素有索引

(start+end) / 2

(整数除法;看起来您使用的是python2.?)。奇偶长度不需要分开包装。位置取决于给定的列表,不是原始长度,len(输入列表)

只需列出所需的三个元素的列表,对其进行排序,然后返回中间元素。因为只有一个临时列表,这显然是一个列表,让我们缩短这个名称。

temp = [
    input_list[start],
    input_list[end],
    input_list[(start+end) / 2]
]
temp.sort()
return temp[1]

您可以将其简化为一个命令函数。为了提高可读性,我将把输入列表重命名为中的

^{pr2}$

相关问题 更多 >