快速排序
排序思路
排序思路:
- 1、取出一个元素p(第一个元素),使元素p归位。
- 2、列表被p分成两部分,左边比p小,右边比p大。
- 3、递归完成排序。
时间复杂度:
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
最坏情况问题:
1、如果列表是倒序排列的,每轮快速排序只能归位一个数,时间复杂度接近
O
(
n
2
)
O(n^2)
O(n2)
实现
归位函数
def partition(li,left,right):
tmp =li[left] #left位置数据赋值给变量tmp,该位置相当于空了。li中第一个元素
while left < right:
while left < right and li[right] >= tmp: #从后往前找,若找到小于tmp的值,将其放到前面空的位置,如果不写left < right 不能退出小循环
right -= 1
li[left] = li[right] #把右边的值写到左边
# print(li,"right")
# print("right值:",right)
# print("left值:",left)
while left < right and li[left] <= tmp: #从前往后找,若找到大于tmp的值,将其放到后面空的位置
left += 1
li[right] = li[left] #把左边的值写到右边
# print(li,"left")
# print("right值:",right)
# print("left值:",left)
li[left] =tmp #循环结束后找到存放的位置,此时left = right ,tmp归位
return left #返回的是第一个值应该归位的位置
li=[3,4,2,1,5,7,8,6,9]
print(li)
partition(li,0,len(li)-1)
print(li)
[3, 4, 2, 1, 5, 7, 8, 6, 9]
[1, 2, 3, 4, 5, 7, 8, 6, 9]
快速排序函数
def quick_sort(li,left,right):
if left< right: #需要至少两个元素 (不加此条件,可能会RecursionError)
mid=partition(li,left,right)
quick_sort(li,0,mid-1)
quick_sort(li,mid+1,right)
li=[3,4,2,1,5,7,8,6,9]
print(li)
quick_sort(li,0,len(li)-1)
print(li)
[3, 4, 2, 1, 5, 7, 8, 6, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]