参考:堆排序
1. 堆的数据结构
大顶堆;
- 堆顶的数据大于子节点的数据;
- 采用数组存储堆
- 父子节点的下标关系:
int child_index;
int fa_index;
fa_index=(child_index-1)/2;
child_index=fa_index*2+1//left
child_index=fa_index*2+2//right
2.维护大顶堆
- 找到孩子中较大数字;
- 进行交换;
- 维护代码
void heapify(vector<int>arr,int n,int i){
//i为维护下标;
int la=i;
int lchild=i*2+1;
int rchild=i*2+2;
if()
int tmp=arr[lchild]>arr[lchild]?lchild:rchild;
if(arr[i]<arr[tmp]){
swap(arr[tmp],arr[i]);
heapify(arr,n,tmp);
}
}
3 建堆
- 从孩子节点开始,不停往上交换
- 代码
for(int i=n/2;i>=0;i--){
heapify(arr,i,n);
}
4.排序
for(int i=n-1;i>0;i--){
sawp(arr[i],arr[0]);
heapfi(arr,i,0);
}
5 整体代码
lc912
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
int size=nums.size();
for(int i1=size/2;i1>=0;i1--){
heapify(nums,i1,size);
}
for(int j=size-1;j>=1;j--){
swap(nums[j],nums[0]);
heapify(nums,0,j);
}
return nums;
}
void heapify(vector<int>& nums,int i,int n){
int large=i;
int lson=i*2+1;
int rson=i*2+2;
int tmp;
if (lson < n && nums[lson] > nums[i]) {
large = lson;
} else {
large = i;
}
if (rson < n && nums[rson] > nums[large]) {
large = rson;
}
if (large != i) {
swap(nums[i], nums[large]);
i = large;
heapify(nums,i,n);
}
}
};