#include<iostream>
using namespace std;
#include<vector>
class MySort{
public:
void adjustHeap(int* arr, int cur, int len){
int parent = cur;
for(int child = 2*cur + 1; child < len; child = 2*child + 1){ // 向下更新孩子节点直至堆内元素全部稳定
if(child+1 < len && arr[child+1] > arr[child]){
child++;
}
if(arr[child] > arr[parent]){
swap(arr[child], arr[parent]);
}
parent = child;
}
}
vector<int> mySort(vector<int>& arr){
int size = arr.size();
for(int i = size/2-1; i >= 0; --i){ // 构造大顶堆:从最后一个非叶子节点开始向上搜索节点并更新
adjustHeap(&arr[0], i, size); // len=arr.size()
}
for(int i = 0; i < arr.size(); ++i){
cout << arr[i] << " ";
}
cout << endl;
for(int i = size-1; i >= 0; --i){ // 调整堆, 向下更新叶子节点,i始终表示当前需要排序的数组的最后一个元素
swap(arr[0], arr[i]); // 最大元素移到数组尾部,剩余元素构成新的待更新数组(下标仍从0开始)
adjustHeap(&arr[0], 0, i); // 更新剩余节点
}
return arr;
}
};
int main(){
vector<int> v{5, 4, 3, 1, 7, 2, 9, 8, 6};
MySort ms = MySort();
ms.mySort(v);
for(int i = 0; i < v.size(); ++i){
cout << v[i] << " ";
}
cout << endl;
return 0;
}
简洁堆排序实现——C++
最新推荐文章于 2023-12-01 22:05:23 发布