堆排序源代码

#include<iostream>
#include<stdio.h>
using namespace std;

//新插入的i节点,其父节点为(i-1)/2
void MinHeapFixup(int arr[],int i)
{
	int j,temp;
	temp=arr[i];
	j=(i-1)/2;//父节点
	while(j>=0&&i!=0)//不是首次插入
	{
		if(arr[j]<=temp)
			break;
		arr[i]=arr[j];//把较大的子节点往下移动,替换它的子节点
		i=j;
		j=(i-1)/2;

	}
	arr[i]=temp;
}
//最小堆中加入新的 数据
void MinHeapAddNumber(int *arr,int n,int num)
{
	arr[n]=num;
	MinHeapFixup(arr,n);
}
/*从堆中删除掉节点,只能从第0个开始删除,为了便于重建堆,
实际的操作是将最后一个数据的值赋给根结点,然后再从根结点开始
进行一次从上向下的调整。调整时先在左右儿子结点中找最小的,如
果父结点比这个最小的子结点还小说明不需要调整了,反之将父结点
和它交换后再考虑后面的结点。相当于从根结点将一个数据的“下沉”
过程。下面给出代码:(n为节点最后的一个数)*/
void MinHeapFixdown(int *arr,int n)//heap sort
{
	int j,temp,i=0;
	temp=arr[0];
	j=2*i+1;
	while(j<=n)
	{
		if(j+1<=n&&arr[j+1]<arr[j])//从两个孩子节点中找最小的那个
			j++;
		if(arr[j]>=temp)
			break;
		//进行调整
		arr[i]=arr[j];
		i=j;
		j=2*i+1;
	}
	arr[i]=temp;
}
int MinHeapDeleteNumber(int *arr,int n)
{
	int temp=arr[0];
	//cout<<arr[0]<<arr[n]<<endl;
	swap(arr[0],arr[n]);
	MinHeapFixdown(arr,n-1);//进行自顶向下调整
	return temp;
}
void main()
{
	int arrs[]={16,7,3,20,17,8};
	int arr[100];
	for(int i=0;i<=5;i++)
	{
		MinHeapAddNumber(arr,i,arrs[i]);
	}
	for(int i=5;i>=0;i--)
	{
		cout<<MinHeapDeleteNumber(arr,i)<<endl;
	}
	system("pause");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值