您的位置:首页 > 其它

算法(2)堆排序

2017-12-01 11:25 260 查看
        堆排序的操作时这样的:

        //Heapfy

        有三个指针(不是C里的物理指针)指向堆中的父结点和左右结点,分别是idx(父),left,right 。

        还有一个largest指向 这三者中最大的那个。

        如果,idx不等于largest,则交换 array[idx]和array[largets]的值,然后从largest开始向后递归。

        注意:这只是完成一次,父>左右结点的操作,并不是整个排序完成,说到底,这个操作只是把小的数放到下面的叶子去了。

        //buildHeap

        排序的时候,从一半的位置向前调用Heapfy,因为一半的后面都是前面的子结点

        以下程序部分借鉴 http://blog.csdn.net/moxiaomomo/article/details/6331386

#include <iostream>

using namespace std;

void Heapfy(int A[],int idx,int max) //建立最大堆
{
int left=idx*2+1;
int right=left+1;
int largest;

if(left<max&&A[left]>A[idx])
largest=left;
else
largest=idx;

if(right<max&&A[largest]<A[right])
largest=right;

if(largest!=idx)
{
int temp=A[largest]; //较大的节点值将交换到其所在节点的父节点
A[largest]=A[idx];
A[idx]=temp;

Heapfy(A,largest,max); //递归遍历

}
}

void buildHeap(int A[],int ll)
{
int len=ll;

for(int i=len/2-1;i>=0;--i) //从一半的位置开始向前,因为一半后面的都是前面的子节点
{
Heapfy(A,i,len); //建立最大堆,将堆中最大的值交换到根节点
}

for(int i=len-1;i>=1;--i)
{
int temp=A[0]; //将当前堆的根节点交换到堆尾的指定位置
A[0]=A[i];
A[i]=temp;

Heapfy(A,0,i); //建立下一次的最大堆
}
}

void show_array(int *a,int len)
{
cout<<endl;
for(int i=0;i<len;i++)
cout<<a[i]<<" ";
cout<<endl;
}

int main()
{
int array[6]={18,10,9,22,1,3};
show_array(array,6);
buildHeap(array,6);
show_array(array,6);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: