快速排序
1:.快速排序思路:
- 取一个元素P(第一个元素),使元素P归位;
- 列表被P分成两部分,左边都比P小,右边都比P大;
- 递归完成。
2代码实现:
每次递归都是求出归位的指针,也就是P的位置。
然后从P位置将乱序的数组分隔成两部分,这两部分依次调用求出P指针位置的,一直分隔下去,知道排序完成。
2.1:递归的函数
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]
while left < right and li[left]<tmp: #当存在左边的值比tmp小,并且有值,将右指针后移一个单位
left +=1
li[right] = li[left]
li[left] = tmp
return left #返回privot指针.
2.2:快速排序的框架
def quick_sort(li,left,right):
if right>left:
mid = partition(li,left,right)
quick_sort(li, left, mid-1) #左边部分进行递归
quick_sort(li, mid+1,right) #右边部分进行递归
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] #把右边的值写道左边
while left < right and li[left]<tmp: #当存在左边的值比tmp小,并且有值,将右指针后移一个单位
left +=1
li[right] = li[left] #把左边的值写道右边
li[left] = tmp
return left #返回privot指针.
def quick_sort(li,left,right):
if right > left:
mid = partition(li,left,right)
quick_sort(li, left, mid-1) #左边部分进行递归
quick_sort(li, mid+1,right) #右边部分进行递归
li = [i for i in range(50)]
import random
random.shuffle(li)
print(li)
quick_sort(li,0,len(li)-1)
print(li)