1. 程式人生 > >quick sort / quick select sort 快排 / 快速選擇排序

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小元素時比快排更有效率。