quick sort / quick select sort 快排 / 快速选择排序

快速排序(快排)和快速选择排序,是两种平均时间复杂度非常高效的算法,其中:
快排平均时间复杂度是O(nlogn),最坏时间复杂度是O( n 2 );
快速选择排序的平均时间复杂度是O(n),最坏时间复杂度是O( n 2 );
排序思想可参考 图文并茂的快排解释
两个函数的python实现如下:

def swap(nums,i,j):
    if i==j:
        return
    temp=nums[i]
    nums[i]=nums[j]
    nums[j]=temp

def quicksort(nums,left,right):

    if(left>right):
        return
    i,j=left,right
    pivot=nums[left]
    while(i<j):
        while(i<j and nums[j]>=pivot):
            j=j-1
            print('j',j)
        while(i<j and nums[i]<=pivot):
            i=i+1
            print('i',i)
        if(i<j):
            swap(nums,i,j)
            print('swap',nums)
    swap(nums,left,i)
    quicksort(nums,left,i-1)
    quicksort(nums,i+1,right)
def quickselect(nums,left,right,k):
    if(left>right):
        return
    i,j=left,right
#    pivot_index=left+((right-left)>>1)
    pivot=nums[left]
#    print('left',left)
#    print('right',right)
    while(i<j):
        while(i<j and nums[j]>=pivot):
            print('j',j,pivot)

            j=j-1
        while(i<j and nums[i]<=pivot):
            print('i',i,pivot)

            i=i+1
        if(i<j):
            swap(nums,i,j)
            print('swap1',nums,i,j)
    swap(nums,left,i)
    print('swap2',nums)
    if(k == i - left + 1) :
        print('k1',i,left)      

        return nums[i] 
    elif(k < i - left + 1):
        print('k2',i,left)      

        return quickselect(nums, left, i - 1, k)  
    else:
        print('k3',i,left)

        return quickselect(nums, i + 1, right, k - (i - left + 1))

arr=[7,2,1,5,6,3,4]

x3=quickselect(arr,0,len(arr)-1,4)

快速选择排序适用于求第k小的元素,由于不需要把所有划分的子集合都排序好,所以在求第k小元素时比快排更有效率。

猜你喜欢

转载自blog.csdn.net/Bismarckczy/article/details/82696476