排序算法:3.选择排序之堆排序

//构造初始堆(大根堆)
void shift(int a[], int  low, int high)
{
	int i = low;
	int j = 2 * i;//a[j]是a[i]的左孩子
	int temp = a[i];
	while (j <= high)
	{
		if (j < high&&a[j] < a[j + 1])
			j++;//若右孩子较大,j指向右孩子
		if (temp < a[j])
		{
			a[i] = a[j];//将a[j]调整到父亲节点上
			i = j;      //修改i和j的值,一边继续向下筛选
			j = 2 * i;
		}
		else
			break;//筛选结束
	}
	a[i] = temp; //被筛选结点的值放入最终位置 
}

构造初始堆(大根堆)相关图

//堆排序算法
void heapsort(int a[], int n)
{
	int i;
	int temp;
	//循环建立初始堆   
	for (i=n/2; i>=1; --i)        
		shift(a,i,n); 
	//选最大值后并调整堆
	for (i = n ; i >= 2; --i)
	{
		temp = a[1];
		a[1] = a[i];
		a[i] = temp;
		shift(a, 1, i - 1);
	}
}
void main()
{
	//构造初始堆时j=2*i(所以i不能为零),下面数组第一个值不算,注意求得n值
	int a[10] = { 0,6,8,7,0,1,3,2,4,5 };
	int n = sizeof(a)/sizeof(a[0])-1;
	
	heapsort(a,n);
	for (int i = 1; i < n+1; i++)
	{
		cout << a[i] << " ";
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值