python - 无法在python中使用快速排序对数组进行排序
问题描述
目前我正在为数组编写排序代码.....但是由于一些错误我无法对我的数组进行排序,请您帮忙修复这些错误。
代码
# QUICK SORT
import math
a = [34, 1, 3, 90, 34, -1, -4,78, 6, 55, 20, -65]
a.append(math.inf)
def partition(l,h,a):
p = l
i = l+1
j = h
while i<j:
while a[i] < a[p]:
i += 1
while a[j] > a[p]:
j -= 1
if i<j:
a[i],a[j] = a[j],a[i]
a[p],a[j] = a[j],a[p]
return j
def quick(l,h,a):
if l<h:
j = partition(l,h,a)
quick(l,j,a)
quick(j+1,h,a)
quick(0,len(a)-1,a)
print(a)
解决方案
我不确定您从哪里获得该算法,但这里有一个基于您的代码的实际有效的算法。这是霍尔分区:
# QUICK SORT
import math
a = [34, 1, 3, 90, 34, -1, -4,78, 6, 55, 20, -65]
a.append(math.inf)
def partition(l,h,a):
p = a[(h+l)//2]
i = l-1
j = h+1
while True:
i += 1
while a[i] < p:
i += 1
j -= 1
while a[j] > p:
j -= 1
if i >= j:
return j
a[i],a[j] = a[j],a[i]
def quick(l,h,a):
if l<h:
j = partition(l,h,a)
quick(l,j,a)
quick(j+1,h,a)
quick(0,len(a)-1,a)
print(a)
跟进
您的代码的问题是while
您必须在 Python 中使用的do/while
循环与他在视频中使用的循环不同。您需要在进入 while 循环之前执行一次操作。这有效:
# QUICK SORT
import math
a = [34, 1, 3, 90, 34, -1, -4, 78, 6, 55, 20, -65]
a.append(math.inf)
def partition(l,h,a):
p = a[l]
i = l
j = h
while i < j:
i += 1
while a[i] <= p:
i += 1
j -= 1
while a[j] > p:
j -= 1
if i < j:
a[i],a[j] = a[j],a[i]
a[l],a[j] = a[j],p
return j
def quick(l,h,a):
if l<h:
j = partition(l,h,a)
quick(l,j-1,a)
quick(j+1,h,a)
quick(0,len(a)-1,a)
print(a)
推荐阅读
- java - 在 Java 列表中使用字符串
- python - PyGame 碰撞系统每隔一段时间才工作一次
- java - 引起:java.lang.ClassNotFoundException: org.apache.orc.storage.ql.exec.vector.VectorizedRowBatch出现在flink query hive中
- css - Ruby on Rails 6 Bootstrap 服务器重启时出现未定义变量错误
- reactjs - React Material-UI 自动完成。如何获得已删除选项的价值?
- r - 根据多个条件过滤一组data.frame
- kubernetes - 水平 pod 自动缩放器无法在 minikube 部署中获取指标
- path - 增加笔触大小时,Curved Path2D 变直
- icalendar - Caldav 未在时间范围查询内返回事件
- rust - 如何为 Struct 实现 `std::iter::FromIterator<_>'?