我的快速排序有什么问题?就地和随机

时间:2014-05-28 11:06:10

标签: python algorithm sorting

我知道这是一个非常受欢迎的主题,但我真的无法在这里找到我的问题。

import random

class QuickSort(object):
    def _choose_pivot(self,l,r):
        return random.sample(range(l,r),1)[0]

    def _partition(self,arr,l,r):
        pivot_idx = self._choose_pivot(l, r) #random pivot
        #move the pivot to the end 
        pivot =  arr[pivot_idx]
        temp =  arr[r-1]
        arr[r-1] = arr[pivot_idx] 
        arr[pivot_idx] = temp
        print arr
        i = l
        for j in range(l,r-1):
            if arr[j]<=pivot:
                temp = arr[j]
                arr[j] = arr[i]
                arr[i] = temp
                i+=1
        #put pivot in its place
        temp = arr[i]
        arr[i] = arr[r-1]
        arr[r-1] = temp
        return i

    def sort(self,arr,l,r):
        if len(arr) <= 1:
            return arr
        if r-l<=2:
            return arr
        pivot_idx = self._partition(arr, l , r)
        self.sort(arr, pivot_idx+1 , r)
        self.sort(arr, l , pivot_idx-1)
        return arr 

例如对于输入a = [8,5,6,2,1,0,4,3],它返回[1,0,2,3,5,6,4,8]。似乎我对基本案例的递归调用存在问题。它没有为每个分区调用sort函数:所以这里的步骤是:

pivot 2
[8, 5, 6, 3, 1, 0, 4, 2]

[1, 5, 6, 3, 8, 0, 4, 2]

[1, 0, 6, 3, 8, 5, 4, 2]

pivot 8
[1, 0, 2, 3, 6, 5, 4, 8]

[1, 0, 2, 3, 6, 5, 4, 8]

[1, 0, 2, 3, 6, 5, 4, 8]

[1, 0, 2, 3, 6, 5, 4, 8]

[1, 0, 2, 3, 6, 5, 4, 8]

pivot 3
[1, 0, 2, 5, 6, 3, 4, 8]

pivot 6
[1, 0, 2, 3, 5, 6, 4, 8]

[1, 0, 2, 3, 5, 6, 4, 8]

1 个答案:

答案 0 :(得分:1)

您似乎使用Python范围表示法:在范围(l,r)中,包含l,r不包含。

因此,数组的分区如下:arr[l:pivot_idx] + [arr[pivot_idx]] + arr[pivot_idx+1:r]

所以我认为错误将通过使用以下行解决:self.sort(arr, l , pivot_idx)

此外,数组中只有一个元素iff r-l<=1