zoukankan      html  css  js  c++  java
  • C++ 堆排序实现

    void HeapAdjust(int a[],int s,int n)//construct heap
    {
    	int j,t;
    	while(2*s+1<n)//是否存在左子树
    	{
    		j=2*s+1;
    		if((j+1)<n)
    		{
    			if(a[j]<a[j+1])//左子树小于右子树,则需要比较右子树
    				j++;//序号增加1,指向右子树
    		}
    		if(a[s]<a[j])//比较s与j为序号的数据
    		{
    			t=a[s];
    			a[s]=a[j];
    			a[j]=t;
    			s=j;//交换后该节点的子节点的堆结构被破坏,需要向下重新调整成堆
    		}
    		else//比较左右孩子均大则堆未被破坏,不需要再调整
    			break;
    	}
    }
    void HeapSort(int a[],int n)//堆排序
    {
    	int t,i;
    	int j;
    	//建堆过程
    	for(i=n/2-1;i>=0;i--)//将a[0,n-1]建成大根堆,建堆时从第一个非叶子节点开始判断是否满足堆结构,然后进行调整
    		HeapAdjust(a,i,n);
    	//将调整好的堆的堆顶元素输出(与末尾元素交换),从根节点开始重新调整整个堆
    	//重复进行n-1次
    	for(i=n-1;i>0;i--)
    	{
    		t=a[0];//与第i个记录交换(i后面的记录已经有序),将堆顶的记录输出
    		a[0]=a[i];
    		a[i]=t;
    		HeapAdjust(a,0,i);//将a[0]至a[i]重新调整为堆,调整堆时由于之前已经满足堆结构,只有堆顶被破坏,所以从堆顶开始向下调整
    	}
    }


  • 相关阅读:
    H5页面富文本展示图片之间存在空隙
    如何关闭eslint语法校验
    K8S service详解
    vim添加或删除多行注释
    K8S 弹性伸缩
    Load高问题排查
    Dockerfile CMD和ENTRYPOINT
    nginx配置
    sed命令
    Pod排错指南
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3073360.html
Copyright © 2011-2022 走看看