堆排序(heapsort)

匿名 (未验证) 提交于 2019-12-03 00:15:02

#include<iostream> #include<stdio.h>  using namespace std; /** 创建一个堆:大的数是根  */  void swap(int arr[],int i,int j) { 	int temp= arr[i]; 	arr[i]=arr[j]; 	arr[j]=temp; } 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 tree[],int n)  { 	//对每一节点都检查一遍就成功建立成了一个堆  	int last_node = n-1; 	int parent=(last_node-1)/2; 	for(int i=parent;i>=0;--i) 	{ 		heapify(tree,n,i); 	} } /* 堆排序:从大到小  */ void heap_sort(int tree[],int n) { 	build_heap(tree,n); 	for(int i=n-1;i>=0;--i) 	{ 		swap(tree,i,0);//交换根节点和最后一个叶子  		heapify(tree,i,0);//砍断那个最后的叶子  	} } int main() { 	int tree[]={4,10,2,5,1,3}; 	int n=6; 	//堆排序  	heap_sort(tree,n); 	 	for(int i=0;i<n;++i) 	{ 		cout<<tree[i]<<" "<<endl; 	 }  	return 0; } 


来自灯神的讲解,这里我加了一点自己的注释:https://www.bilibili.com/video/av47196993

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!