diff --git a/general/src/algorithm/sorter.hpp b/general/src/algorithm/sorter.hpp index 6461955..4700af6 100644 --- a/general/src/algorithm/sorter.hpp +++ b/general/src/algorithm/sorter.hpp @@ -102,8 +102,8 @@ template void buildMaxHeap(T A[], int len) //建立最大堆 { std::cout <<"\r\n"; -// 从最后一个非叶子节点(n/2-1)开始自底向上构建, - for (int i = len / 2-1; i >= 0; i--) //从(n/2-1)调用一次maxHeapIfy就可以得到最大堆 +// 从最后一个非叶子节点(n/2-1)开始自底向上构建,根据完全二叉树的性质, i --肯定也是根节点。从右到左,从下到上调整。 + for (int i = len / 2 - 1; i >= 0; i--) //从(n/2-1)调用一次maxHeapIfy就可以得到最大堆 maxHeapIfy(A, i, len); for (int i = 0; i < len; i++){ std::cout << A[i]<<" "; @@ -139,10 +139,18 @@ void PreOrderTraverse(BSTNode *data) PreOrderTraverse(data->rchild); } } - +/* + *其实整个堆排序过程中, 我们只需重复做两件事: +建堆(初始化+调整堆, 时间复杂度为O(n)); +拿堆的根节点和最后一个节点交换(siftdown, 时间复杂度为O(n*log n) ). + */ template int heapsort(T *data,uint64_t len,CompareHanlder handle){ - buildMaxHeap(data, len); //先建立堆 + buildMaxHeap(data, len); //先建立最大堆,最大堆只能保证根节点比左右两个子树还大 + + + + // todo }