计算排序时元素比较的数量

时间:2019-04-19 15:01:26

标签: python algorithm sorting quicksort

我正在做一个快速排序算法。我的问题是排序时如何计算比较次数。还有第二个问题。如何选择“枢轴”元素?敌人的例子,我希望我的第一个元素成为数据透视元素。

import random 
def partition(arr,low,high): 
    i = ( low-1 )         # index of smaller element 
    pivot = arr[high]     # pivot 

    for j in range(low , high): 

        # If current element is smaller than or 
        # equal to pivot 
        if   arr[j] <= pivot: 

            # increment index of smaller element 
            i = i+1 
            arr[i],arr[j] = arr[j],arr[i] 

    arr[i+1],arr[high] = arr[high],arr[i+1] 
    return ( i+1 ) 

# The main function that implements QuickSort 
# arr[] --> Array to be sorted, 
# low  --> Starting index, 
# high  --> Ending index 

# Function to do Quick sort 
def quickSort(arr,low,high): 
    if low < high: 

        # pi is partitioning index, arr[p] is now 
        # at right place 
        pi = partition(arr,low,high) 

        # Separately sort elements before 
        # partition and after partition 
        quickSort(arr, low, pi-1) 
        quickSort(arr, pi+1, high) 

# Driver code to test above 
arr = random.sample(range(0, 9999), 1000)
n = len(arr) 
quickSort(arr,0,n-1) 
print ("Sorted array is:") 
for i in range(n): 
    print ("%d" %arr[i]),

2 个答案:

答案 0 :(得分:0)

首先, 您可以通过此行计算比较次数:

        if   arr[j] <= pivot: 

因为在整个快速排序算法中,它仅是元素的比较。您可以计算单个变量执行此行的时间。

第二, 您无需选择数据透视元素。因为枢轴元素是由该行自动设置的

    pivot = arr[high] 

这是原始算法。您可以手动选择,还需要重新设计算法。

答案 1 :(得分:0)

对于第一个问题,您可以定义一个全局变量并在需要时对其进行递增。

count = 0  # define it in global scope

def partition(arr,low,high): 
    i = ( low-1 )         # index of smaller element 
    pivot = arr[high]     # pivot 

    for j in range(low , high): 

        # If current element is smaller than or 
        # equal to pivot 

        count += 1  # increment wherever you want

        if   arr[j] <= pivot: 

            # increment index of smaller element 
            i = i+1 
            arr[i],arr[j] = arr[j],arr[i] 

    arr[i+1],arr[high] = arr[high],arr[i+1] 
    return ( i+1 ) 

您可以在进行排序后访问其正确的值。

对于第二个问题,枢轴的选择由您选择。您实际上正在执行此操作:

pivot = arr[high] # pivot

您正在使用子数组的最后一个元素作为枢轴。您可以使用arr[low]选择第一个元素。

注意:欢迎使用StackOverflow社区。许多其他用户可能想问或以前曾问过的问题似乎很多!其他人对类似问题的回答可能会解决您的问题。您还可以查看以下SO答案,以获取有关计数比较次数和选择数据透视的更多信息: For first questionFor second question