1. 递归
'''
思路:
指定第一个元素为基准,找到其的准确位置,将比基准小的放在基准的左面,比基准大的元素放在其右面。在左右两个子集中重复上述操作,递归。
'''
def pritation(ls,i,j):
x=ls[i]
while i<j:
while (ls[j] >= x )and (i<j):
j=j-1
if i<j:
ls[i] = ls[j]
i+=1
while (ls[i] <= x) and (i<j):
i=i+1
if i < j:
ls[j]=ls[i]
j -= 1
ls[i]=x #此位置元素是准确的
return i #返回的是基准的位置
def quick_sort(ls,left,right):
if left < right:
p=pritation(ls,left,right) #递归出口
quick_sort(ls,left,p-1)
quick_sort(ls,p+1,right)
return ls
s = [1, 8, 1, 4, 3, 9, 5, 4, 11, 2, 2, 15, 6]
print("before sort:",s)
s1 = quick_sort(s, left = 0, right = len(s) - 1)
print("after sort:",s1)
2.非递归,利用栈存放待排序部分的左右指针
def quick_sort(ls):
l = 0
r = len(ls)-1
stack = []
stack.append(r)
stack.append(l)
while stack:
i = stack.pop() #弹出小指针
j = stack.pop() #弹出大指针
k = pritation(ls, i, j)
if k-1 > i:
stack.append(k-1) #压入大指针
stack.append(i) #压入小指针
if k+1 < j:
stack.append(j)
stack.append(k+1)
def pritation(ls, i, j):
base = ls[i]
while i < j and ls[j] >= base:
j -= 1
if i < j:
ls[i] = ls[j]
i += 1
while i < j and ls[i] <= base:
i += 1
if i < j:
ls[j] = ls[i]
j -= 1
ls[i] = base
return i