python - 迭代就地子列表堆排序python实现
问题描述
我为 python 找到了不同版本的堆排序,但我似乎找不到符合我需要的那个。
迭代堆排序是我发现的最接近的,但我无法完全弄清楚如何将其更改为与子列表(索引开始,索引结束)一起使用并保持原位。
如果我做对了,那么我会在这里发布我的答案。
如果有人甚至在 C 或 Java 中都有实现,那就太好了。
解决方案
我设法做我想做的事。此代码适用于对象并按特定属性排序。
def buildMaxHeap(arr, arrayLength, indexStart, attr):
for i in range(arrayLength):
# if child is bigger than parent
if getattr(arr[indexStart + i], attr) > getattr(arr[indexStart + int((i - 1) / 2)], attr):
j = i
# swap child and parent until
# parent is smaller
while getattr(arr[indexStart + j], attr) > getattr(arr[indexStart + int((j - 1) / 2)], attr):
(arr[indexStart + j],
arr[indexStart + int((j - 1) / 2)]) = (arr[indexStart + int((j - 1) / 2)], arr[indexStart + j])
j = int((j - 1) / 2)
def heapSort(arr, arrayLength, indexStart, attr):
buildMaxHeap(arr, arrayLength, indexStart, attr)
for i in range(arrayLength - 1, 0, -1):
# swap value of first indexed
# with last indexed
arr[indexStart + 0], arr[indexStart + i] = arr[indexStart + i], arr[indexStart + 0]
# maintaining heap property
# after each swapping
j, index = 0, 0
while True:
index = 2 * j + 1
# if left child is smaller than
# right child point index variable
# to right child
if (index < (i - 1) and getattr(arr[indexStart + index], attr) < getattr(arr[indexStart + index + 1], attr)):
index += 1
# if parent is smaller than child
# then swapping parent with child
# having higher value
if index < i and getattr(arr[indexStart + j], attr) < getattr(arr[indexStart + index], attr):
arr[indexStart + j], arr[indexStart + index] = arr[indexStart + index], arr[indexStart + j]
j = index
if index >= i:
break
推荐阅读
- reactjs - 如何传递属性,使用下一个 JS?
- sql - MS Access:确定 4 列中的第二高值
- composer-php - Swiftmailer“基本用法”导致未捕获的 ArgumentCountError:参数太少
- python - cv2.imshow() 无法正确显示图像
- python - 用于 Python 的 MySQL 连接器抛出“在查询期间丢失与 MySQL 服务器的连接”
- c# - 将 C# Blazor 应用程序部署到 AzureWebSites,但索引是常规 HTML 页面
- html - 为什么我的 Materialize Select 不起作用,即使我复制了代码?
- javascript - 性能问题 Nuxt.js
- influxdb - influxdb 连续查询将数据移动到保留策略,选择具有许多转换的多个值
- java - 如何获取 SurfaceView 的 Surface