主要还是学习使用栈模拟实现递归:
# -*- coding: utf-8 -*-
def partition(arr,low,high):
# 这时另外一种考虑方式,而且他是不需要额外空间的,他只使用一个指针来区分小于基准和大于基准的
# pointer_less_than代表这个指针的左边全部都是小于基准的(包括自己,不包括首元素)
# 然后从左往右扫描,遇到小于基准的元素,就把小于基准元素区域的后面紧接着的一个元素和他交换
# 那么小于基准元素区域就多了一个元素,。。。就这样小于基准的元素就连在了一起
# 首元素是基准元素,小于基准元素区域块,大于基准元素区域块,现在分成了三个部分
# 把首元素和小于基准元素区域块最后一个元素交换,那三部分就变成,小于的,基准,大于的
# 刚开始小于基准的元素为0,暂且指向首位值
pointer_less_than = low
# 然后一次扫描后面所有元素
for i in range(pointer_less_than +1,high+1):
# 遇到小于基准的,就把小于基准元素区域的后面紧接着的一个元素和他交换,小于的块相当于也更新了
if arr[i] < arr[low] :
pointer_less_than +=1
arr[pointer_less_than],arr[i]=arr[i],arr[pointer_less_than]
# 把首元素和小于基准元素区域块最后一个元素交换,那三部分就变成,小于的,基准,大于的
arr[low],arr[pointer_less_than] = arr[pointer_less_than],arr[low]
return pointer_less_than
class guide:
def __init__(self,left =None,right =None):
self.left =left
self.right =right
def quick_sort(arr):
stack =[guide(0,len(arr)-1),]
while stack:
pointer = stack.pop()
index = partition(arr,pointer.left,pointer.right)
if index+1 <= pointer.right:
stack.append(guide(index+1,pointer.right))
if pointer.left <= index-1:
stack.append(guide(pointer.left,index-1))
arr = [7,9,6,5,4,8,3,1]
print(arr)
quick_sort(arr)
print(arr)
runfile(\'D:/share/test/stack_recursion.py\', wdir=\'D:/share/test\')
[7, 9, 6, 5, 4, 8, 3, 1]
[1, 3, 4, 5, 6, 7, 8, 9]
继续阅读与本文标签相同的文章
上一篇 :
【全记录】2017杭州·云栖大会阿里云服务专场
-
《DNS攻击防范科普系列4》--遭遇DNS缓存投毒该怎么办?
2026-05-18栏目: 教程
-
进击的 Java ,云原生时代的蜕变
2026-05-18栏目: 教程
-
阿里云Kubernetes平台构建和管理实践(上)
2026-05-18栏目: 教程
-
阿里云Kubernetes平台构建和管理实践(下)
2026-05-18栏目: 教程
-
F5的SSL加解密和负载均衡器如何提高安全性?
2026-05-18栏目: 教程
