1.思想:
1.取出一个元素,假如p,使得p归位,就是放到排序完成后应该在的位置
2.当p归位的时候,p左边的元素都比p小,p右边的元素到比p大
3.递归完成排序
2.算法
1.取出一个元素,使得该元素归位
2.然后返回该元素归位的位置,并依次分为左边和右边连个序列
3.然后按照左边和右边的序列,递归调用快速排序
3.代码实现:
1.首先要写出归位函数
归位函数算法思想:
归位函数:
不断的交换要归位的数(归位数)在列表中的位置,
1.首先要有两个下标,用来标记最左边和最右边
2.先从右边开始交换比归位数要小的数,并且最右边的下标不断减一到右边有比归位数要小的数的下标,
如果没有这直接退出循环,条件是最左边的小标要大于最右边的下标
3.然后又从最左边开始交换比归位数要大的数,并且最左边的下标不断加一到左边有比归位数要大的数的下标,
如果没有这直接退出循环,条件是最左边的小标要大于最右边的下标
4.加入下标left < right,说明没有遍历完,接着用循环遍历第2和3步
归位函数实现:
def partition(li,left,right):
tmp = li[left] #存储要归位的数
while left < right:
while left < right and li[right] >= tmp: #从右边找比tmp大的数
right -= 1
li[left] = li[right] #找到右边的数比tmp小,然后交换两个数
while left < right and li[left] <= tmp: #从左边找比tmp大的数
left += 1
li[right] = li[left] #找到左边的数比tmp大,交换两个数
#这里是防止,要归位的数就是最小的时候,上面直接退出循环,而他就直接放到首位
li[left] = tmp
return left #返回已经归位函数的下标,然后为快速排序的的递归提供位置
2.真正的快速排序算法
def quick_sort(li, left, right):
if left < right: #假设列表有两个元素以上
mid= partition(li,left,right) #将元素归位,就是要排序的元素放到按顺序应该放到的位置
#递归调用排序左边和右边的元素
quick_sort(li,left,mid - 1)
quick_sort(li,mid+1,right)