堆与堆排序——数据结构的克星

两盒软妹~` 提交于 2020-02-05 13:58:28

其实建堆和堆排序十分的简单,就是不断的向下调整的过程
建堆是从floor(2/i)处开始,一直到根节点,依次不断的向下调整
堆排序是从最后一个节点不断的与第一个根节点交换,然后再让第一
个节点不断的向下的调整

#include<bits/stdc++.h>
using namespace std;
int a[15]={-1000,1,5,6,3,9,5,4,2,7,7};
int n=10;//表示数组的长度 

void adjust_down(int i,int len)
{
	int left=2*i;
	int right=2*i+1;
	int m=i;//记录最大值
	if(left<=len&&a[m]<a[left]) 
	{
		m=left;
	}
	if(right<=len&&a[m]<a[right])
	{
		m=right;
	}
	if(m!=i)//如果左右孩子都不满足,就不需要继续向下跟新了 
	{
		swap(a[m],a[i]);
		adjust_down(m,len); 
	}
}
void build_heap()
{
	for(int i=n/2;i>=1;i--)
	{
		adjust_down(i,n);
	}
 } 
 void heap_sort()
 {
 	for(int i=n;i>=2;i--)//调整n-1次就行了 
 	{
 		swap(a[i],a[1]);
 		adjust_down(1,i-1);
	 }
 }
int main()
{
	build_heap();
	heap_sort();
	for(int i=1;i<=n;i++)
	{
		cout<<a[i]<<" ";
	 } 
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!