完全二叉树应用之堆排序算法
原理
完全二叉树是严格按照从上到下,从左向右排列的二叉树
步骤:
1、根据给定的关键词创建一个堆 2、输出堆顶的元素(如果是最大值则为最大堆,最小值则为最小堆) 3、调整余下元素,使其成为一个新堆(从 size/2 开始调整 即倒数第二次最后一个根节点开始调整) 4、重复(2)(3),直到输出n个元素,得到一个有序数列
#include <iostream>
#include <vector>
using namespace std;
class Solution{
public:
void swap(int& a, int& b){
int temp = b;
b = a;
a = temp;
}
void heapify(vector<int>& tree ,int size, int i){
int left = 2 * i + 1;
int right = 2 * i + 2;
int parent = (i - 1) / 2;
if(left > size )
return ;
else if(left <= size && right > size){
if(tree[i] > tree[left]){
swap(tree[i], tree[left]);
}
return ;
}
else{
int min = i;
if(tree[min] > tree[left])
min = left;
if(tree[min] > tree[right])
min = right;
swap(tree[i], tree[min]);
}
return ;
}
vector<int>& creat_heap(vector<int>& tree){
int size = tree.size() - 1 ;
int n = size / 2;
while(n >= 0){
heapify(tree,size,n);
n--;
}
return tree;
}
vector<int> min_heap_sort(vector<int>& tree){
vector<int> ans;
while(tree.size()-1 > 0){
vector<int> res = creat_heap(tree);
ans.push_back(res.front());
tree.erase(tree.begin());
}
ans.push_back(*tree.begin());
return ans;
}
};
int main(){
vector<int> tree{49,97,13,38,27,49,76,65,44,54,33};
Solution sl;
vector<int> res = sl.min_heap_sort(tree);
for(auto i : res)
std::cout << i << " ";
std::cout << std::endl;
return 0;
}
|