quick sort / quick select sort 快排 / 快速選擇排序
阿新 • • 發佈:2018-11-06
快速排序(快排)和快速選擇排序,是兩種平均時間複雜度非常高效的演算法,其中:
快排平均時間複雜度是O(nlogn),最壞時間複雜度是O(
);
快速選擇排序的平均時間複雜度是O(n),最壞時間複雜度是O(
);
排序思想可參考 圖文並茂的快排解釋
兩個函式的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小元素時比快排更有效率。