堆结构及堆排序heapify
经朋友推荐,在b站看正月点灯笼讲解的堆排序。感觉讲的不错。小计总结。
堆heap:
堆的结构是完全二叉树:
从上到下,从左往右。父节点值>子节点;
heapify(形成堆结构排序):父节点与最大子节点交换,形成堆的结构;从h-1层(倒数第二层)
逻辑公式表示:
int arr[] = {10,5,8,3…};
节点:i=3;
P=(i-1)/2;
c1=2i+1;
c2=2i+2;
代码:
//数组交换;
void swap(int arr[],int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
//从上往下heapify(形成堆结构排序);
void heapify(int tree[],int n,int i){
if(i>=n){
return;
}
int c1=2*i+1;
int c2=2*i+2;
int max=i;
if(c1<n&&tree[c1]>tree[max]){
max=c1
}
if(c2<n&&tree[c2]>tree[max]){
max=c2
}
if(max!=i){
swap(tree,max,i);
heapify(tree,n,max);
}
}
//从下到上构建堆;
void build_heap(){
int last_node=n-1;
int parent=(last_node-1)/2;
int i;
for(i=parent;i>=0;i--){
heapify(tree,n,i);
}
}
//从小到大;
void heap_sort(int tree[], int n){
build_heap(tree,n);
int i;
for(i=n-1;i>=0;i--){
swap(tree,i,0);
heapify(tree,i,0);
}
}
int main(){
int tree[]={
4,10,3,5,1,2};
int n=6;
heapify(tree,n,0);
int i;
for(i=0;i<n;i++;){
System.out.print(tree[i]);
}
return 0;
}
喜欢正月大神的或者看到这里的朋友,给个赞和关注就好。thx!
如果帮助到了您,麻烦关注,点赞,收藏,三连。
您的肯定,是我的动力。祝中华民族早日复兴!谢谢大家。
؏؏☝ᖗ乛◡乛ᖘ☝؏؏