快速排序

上面列出了快排的思路,下面我们整理下:
(1) 快排的思想基于归并排序,其空间复杂度为O(1)
(2) 一般情况下以第一个元素作为基准pivot,设置2个指针,左右指针分别指向index=0,和index=n-1的位置;
首先right_index向左移动,没有找到right_index--,直至找到list[right_index]<pivot的元素,与left_index指向元素交换,left_index++
其次left_index向右移动,没有找到left_index--,直至找到list[left_index]>pivot的元素,与right_index指向元素交换,right_index----
当left_index=right_index,令list[left_index]=pivot 第一轮排序交换结束;得到pivot的左边元素值都小于pivot,右边大
(3) 递归的思想,pivot左边或者右边有分别执行这样的操作
def QuickSort(array,left,right):
# 递归的退出条件
if left >= right:
return
temp = array[left]
i = left
j = right
while i<j:
#两个指针,先动右边的指针,判断指针指向的元素是否小于基准元素,若小于,就要交换位置,移动到左边
while array[j]>temp and i<j:
j -= 1
if array[j]<temp:
#交换array[j]和array[i]
array[i] = array[j]
i += 1
while array[i]<temp and i<j:
i += 1
if array[i]>temp:
#交换array[j]和array[i]
array[j] = array[i]
j -= 1
#退出循环后,i,j重合,此时所指向的位置为基准元素的位置
array[i] = temp
#对基准元素左边排序
QuickSort(array,left,i-1)
#对基准元素右边排序
QuickSort(array,i+1,right)
if __name__ == "__main__":
array = [30,40,60,10,20,50]
left,right = 0,len(array)-1
QuickSort(array,left,right)
print(array)

浙公网安备 33010602011771号