堆结构及堆排序heapify

堆结构及堆排序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!
如果帮助到了您,麻烦关注,点赞,收藏,三连。
您的肯定,是我的动力。祝中华民族早日复兴!谢谢大家。
؏؏☝ᖗ乛◡乛ᖘ☝؏؏

おすすめ

転載: blog.csdn.net/weixin_39434182/article/details/106204588