python 实现快排
思想
1.分而治之,数组开头选择划分元素pivot
i 小于等于pivot的放左边 i+=1
j 大于pivot的放右边 j-=1
两边停止则交换值(i<j)
原位排序,只需要很少的辅助空间
2.平均时间复杂度
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
3.最坏时间复杂度
O
(
n
2
)
O(n^2)
O(n2)
要求:十五分钟以内完成代码
def quick_sort(alist,start,end):
if len(alist)<=1:
return alist
if start<end:
split = partition(alist,start,end)
quick_sort(alist,start,split-1)
quick_sort(alist,split+1,end)
return alist
def partition(alist,start,end):
pivot = start
i = start+1
j = end
while True:
while alist[i]<=alist[pivot]:
if i<j:
i += 1
else:
break
while alist[j]>alist[pivot]:
j -= 1
if i < j:
alist[i],alist[j] = alist[j],alist[i]
else:
break
alist[pivot],alist[j] = alist[j],alist[pivot]
return j
if __name__=="__main__":
alist = [4,1,2,3,1,5,6,10,2,3]
r = quick_sort(alist,0,len(alist)-1)
print(r)
可视化实现
def partition(alist, start, end):
pivot = start
i = start + 1
j = end
while True:
while alist[i] <= alist[pivot] :
i += 1
if i > j:
break
while alist[j] > alist[pivot]:
j -= 1
if i <= j:
alist[i], alist[j] = alist[j], alist[i]
else:
break
# 交换pivot 与j 的值
alist[pivot], alist[j] = alist[j], alist[pivot]
return j
def quick_sort(alist, start, end):
if start < end:
mid = partition(alist, start, end)
quick_sort(alist, start, mid-1)
quick_sort(alist, mid+1, end)
else:
return alist
if __name__ == "__main__":
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ["SimHei"]
import random
import numpy as np
alist = np.random.randint(20, 100, 20)
print("初始结果:", alist)
quick_sort(alist, 0, len(alist) - 1)
print("排序的结果:", alist)
plt.plot(range(1, len(alist)+1), alist, "r--", label="快速排序")
plt.xlabel("x轴")
plt.ylabel("序列值")
plt.title("快速排序")
plt.grid()
plt.legend()
plt.show()