#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");
}
堆排序源代码
最新推荐文章于 2023-02-03 21:35:14 发布