排序算法--堆排序demo

一、 堆排序简介


根结点的关键字是堆里所有结点关键字中最小者的堆称为小根堆,又称最小堆

根结点的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆。

下面,以最大堆为例,对堆排序简单说明。


二、 堆排序示例


堆排序,最大的难点就是调整堆,下面给出代码,已经做了详细的注释。

//调整为最大堆
//a: 数组;start:开始调整堆的位置;len:数组长度
void adjuctHeap(int a[], int start, int len)
{
	int left = 2 * start + 1; 		//节点start的左孩子
	int right = 2 * start  + 2;             //节点start的右孩子
	int largest = start;			//左右孩子最大值的索引
	int tmp = 0;				//临时变量,用于交换
	
	while ((left < len) && (right <= len))
	{
		if (a[largest] < a[left])	//如果小于左孩子,则largest保存为左孩子的索引
		{
			largest = left;	
		}

                if (right != len)  //如果不相等,才执行,相等的话,说明右孩子不存在,不需要比较
                {
    		     if ( a[largest] < a[right])	 //如果小于右孩子,则largest保存为右孩子的索引
    		    {
    			    largest = right;
    		    }
                }
        
		//到这里,说明largest存储的是左右孩子中的最大值的索引,或者本身的索引
		
		if (largest != start)	//如果不相等,说明父节点与孩子节点需要交换
		{
			//父节点与最大值的孩子节点,交换数据
			tmp = a[start];
			a[start] = a[largest];
			a[largest] = tmp;
			
			//start修改为孩子节点索引,进行下一次的循环
			start = largest;
			left = 2 * largest + 1;
			right = 2 * largest + 2;
		}
		else	//如果相等,说明不需要交换,已经符合最大堆的性质,退出循环
		{
			break;
		}
		
	}
}

三、 demo下载


堆排序demo


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值