为什么我的使用随机枢轴的快速排序比使用固定枢轴的快速排序慢?

时间:2018-06-05 04:41:17

标签: python algorithm sorting runtime quicksort

使用随机支点进行快速排序:

shouldComponentUpdate

使用固定枢轴进行快速排序:

def quicksort(arr): # with random index
    if (len(arr) <= 1):
        return arr
    else:
        grt_arr = []
        less_arr = []
        rand_indx = random.randint(0,len(arr)-1)    
        pivot = arr[rand_indx] # picking up a random index
        #for ele in arr[1:]:
        for ele in (arr[0:rand_indx]+arr[rand_indx+1:]):
            if (ele <= pivot):
                less_arr.append(ele)
            elif (ele > pivot):
                grt_arr.append(ele)

    return quicksort(less_arr)+[pivot]+quicksort(grt_arr)

在以下列表中运行算法后,我得到以下结果。

def quicksortfixedpivot(arr): # with fixed index
    if (len(arr) <= 1):
        return arr
    else:
        grt_arr = []
        less_arr = []
        pivot = arr[0] # picking up a fixed 0 index
        for ele in arr[1:]:
            if (ele <= pivot):
                less_arr.append(ele)
            elif (ele > pivot):
                grt_arr.append(ele)

    return quicksortfixedpivot(less_arr)+[pivot]+quicksortfixedpivot(grt_arr)

运行时间如下所示:

# create a list of random numbers
arr1 = (random.sample(range(0,10000000),1000000))
  

CPU时间:用户8.74秒,sys:219毫秒,总计:8.95秒   壁挂时间:9.22秒

%%time
out1 = (quicksort(arr1))
  

CPU时间:用户6.39秒,系统:138毫秒,总计:6.53秒   壁挂时间:6.54秒

为什么我的quicksortfixedpivot比使用固定支点的quicksort更快?

3 个答案:

答案 0 :(得分:4)

The problem is, in your random index one, the code rand_indx = random.randint(0,len(arr)-1) happens over 600,000 times. Though each call takes very little, this adds up.

Try it yourself: just add in the call to random.randint(0,len(arr)-1) to your fixed pivot and time them again.

答案 1 :(得分:3)

For random data, choice of pivot won't make much difference, and the overhead of choosing a random pivot is probably part of the reason why it's slower. There's also the overhead of Python having to interpret more lines of code with the random version.

答案 2 :(得分:0)

快速排序的平均大小写复杂度为O(N log N),但实际复杂程度可能会因O(N)O(N²)而异,具体取决于您的广告选择和数据。例如,如果您的数组已经排序(或几乎)选择第一个元素作为数据透视表,或者最后一个元素可能是一个非常糟糕的数据透视选择或一个很好的选择。

随机数据选择有利于减少陷入这种情况的可能性。

但是,由于您的数据集是随机的,因此您选择的数据集影响不大。要说服自己,您只需计算每个函数的调用次数。

我已经在您的代码上完成了1000000个元素,差异低于0.1%。

计算时间的差异可能是由于代码中唯一真正的差异:random.randint(0,len(arr)-1)的计算