Algorithm HeapSort-交换前排序

Algorithm HeapSort-交换前排序,algorithm,sorting,heapsort,max-heap,Algorithm,Sorting,Heapsort,Max Heap,我在研究算法,特别是希普索尔。据我所知,heapsort算法首先将列表转换为max堆,然后准备列表 转动我的 [2,8,5,3,9,1] 进入 [9,8,5,3,2,1] 与希普索尔,我应该交换9与1。但是通过直接在最大堆之后查看数组,我看到一个按降序排序的列表。当列表已按降序排序时,为什么需要交换 这只是我看了之后的想法: 将其作为堆后,不必按降序排序 堆只要求每个节点都比其子节点大(或小,对于最小堆),但没有说明子节点的顺序,也没有说明不同级别的节点之间的关系(如果一个不是另一个的直接后代,

我在研究算法,特别是希普索尔。据我所知,heapsort算法首先将列表转换为max堆,然后准备列表

转动我的

[2,8,5,3,9,1]

进入
[9,8,5,3,2,1]

与希普索尔,我应该交换9与1。但是通过直接在最大堆之后查看数组,我看到一个按降序排序的列表。当列表已按降序排序时,为什么需要交换

这只是我看了之后的想法:

将其作为堆后,不必按降序排序

堆只要求每个节点都比其子节点大(或小,对于最小堆),但没有说明子节点的顺序,也没有说明不同级别的节点之间的关系(如果一个不是另一个的直接后代,请参见下面的
5
6
)。这意味着这也是一个有效堆:

     9
   /   \
  5     8
 / \   /
1   2 6

[9, 5, 8, 1, 2, 6]

将其作为堆之后,不一定按降序排序

堆只要求每个节点都比其子节点大(或小,对于最小堆),但没有说明子节点的顺序,也没有说明不同级别的节点之间的关系(如果一个不是另一个的直接后代,请参见下面的
5
6
)。这意味着这也是一个有效堆:

     9
   /   \
  5     8
 / \   /
1   2 6

[9, 5, 8, 1, 2, 6]
谢谢你的提问

当列表已按降序排序时,为什么需要交换

根据定义:堆数据结构是一个完整的二叉树,其根属性大于(或小于)子属性

函数的作用是:保证堆的构造。在你的例子中,它恰好是按降序排列的。另一种情况是在杜克林的回答中指出的,这并不是按降序排列的

在堆排序中,在第一个heapify()调用之后,我们只知道一件事。堆的根(数组中的第一个元素)是数组中的最大元素。因此,将其移动到其位置(最后一个位置),将数组大小减小1,并对所有元素再次应用相同的步骤

heapify()操作将是O(log n),因此O(n log n)的总复杂性

希望有帮助

谢谢你的提问

当列表已按降序排序时,为什么需要交换

根据定义:堆数据结构是一个完整的二叉树,其根属性大于(或小于)子属性

函数的作用是:保证堆的构造。在你的例子中,它恰好是按降序排列的。另一种情况是在杜克林的回答中指出的,这并不是按降序排列的

在堆排序中,在第一个heapify()调用之后,我们只知道一件事。堆的根(数组中的第一个元素)是数组中的最大元素。因此,将其移动到其位置(最后一个位置),将数组大小减小1,并对所有元素再次应用相同的步骤

heapify()操作将是O(log n),因此O(n log n)的总复杂性

希望有帮助