一、算法
- 快排
(一)递归
# -*- coding: utf-8 -*-
# 参考链接(python递归实现) http://python.jobbole.com/82270/
# 伪代码 https://hit-alibaba.github.io/interview/basic/algo/Sorting.html?q=
def q_sort(lists, left, right):
# 一趟
if left >= right: # todo >=
return lists
key = lists[left]
low = left
high = right
while left < right:
while left < right and lists[right] >= key: # todo 1. left 不能 <= right 2. lists[right]可以 >= key
right -= 1
lists[left] = lists[right]
while left < right and lists[left] <= key:
left += 1
lists[right] = lists[left]
lists[left] = key # todo 都可以
# 递归左边 & 右边
mid = left
q_sort(lists, low, mid - 1)
q_sort(lists, mid + 1, high)
return lists
a = [3, 5, 6, 1, 2]
# a = [1, 2, 3, 5, 6]
a = q_sort(a, 0, 4)
print(a)
(二)非递归
# -*- coding: utf-8 -*-
def q_sort_by_stack(lt, st):
while True:
if st == []:
return lt
right = st.pop()
left = st.pop()
key = lt[left]
low = left
high = right
while left < right:
while left < right and lt[right] >= key:
right -= 1
lt[left] = lt[right]
while left < right and lt[left] <= key:
left += 1
lt[right] = lt[left]
lt[left] = key
mid = left
if mid - 1 > low:
st.append(low)
st.append(mid - 1)
if high > mid + 1:
st.append(mid + 1)
st.append(high)
# return lt
def q_sqort(lt):
if lt is None or len(lt) <= 1:
return lt
st = []
st.append(0)
st.append(len(lt) - 1)
return q_sort_by_stack(lt, st)
a = [3, 5, 1, 2, 4]
a = q_sqort(a)
print(a)