快速排序(快排)和快速选择排序,是两种平均时间复杂度非常高效的算法,其中:
快排平均时间复杂度是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小元素时比快排更有效率。