关于二叉堆的三个操作:上浮、下沉、建堆,请参考二叉堆及代码实现
代码实现:
注意这里建的是最小堆
#include <bits/stdc++.h>
using namespace std;
void upAdjust(int arr[],int n){//下沉操作
int child = n;
int parent = child/2;
int temp = arr[child];
while(child > 0 && temp < arr[parent]){
arr[child] = arr[parent];
child = parent;
parent = child/2;
}
arr[child] = temp;
}
void shift(int arr[],int low,int high){//下沉操作
int i=low,j=2*i;
int temp = arr[i];
while(j<=high){
while(j < high && arr[j+1]<arr[j])
j++;
if(temp > arr[j]){
arr[i] = arr[j];
i = j;
j = 2*i;
}else
break;
}
arr[i] = temp;
}
void buildHeap(int arr[],int n){
for(int i=n/2;i>=1;i--)//建堆
shift(arr,i,n);
}
int main(){
int arr1[] = {0,43,65,6,43,78,342,78,34};//上浮一次
upAdjust(arr1,8);
for(int i=1;i<=8;i++)
cout<<arr1[i]<<" ";
cout<<endl;
int arr2[] = {0,43,65,6,43,78,342,78,34};//建立一次最小堆
buildHeap(arr2,8);
for(int i=1;i<=8;i++)
cout<<arr2[i]<<" ";
return 0;
}