算法(2)堆排序

来源:互联网 发布:软件方案文档 编辑:程序博客网 时间:2024/05/01 22:59

        堆排序的操作时这样的:

        //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;     elselargest=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;}


原创粉丝点击