堆排序 heapsort



    以下代码包含三部分代码 1.MaxHeapIFY,BuidMaxHeap,HeapSort
2.HeapIncreaseKey,MaxHeapInsert,BuidMaxHeap2
其中 BuildMaxHeap采用 MaxHeapIFY作为子过程,BuildMaxHeap2采用 MaxHeapInsert作为子过程。两种构造最大堆的方法不同点在于前者是一种bottom-up 的方案:即保证某个二叉树是最大堆,那么首先他的左子树和右子树都是最大堆。后者是每插入一个节点,我们要保证该节点比他的父节点小。
前者的算法复杂度为O(n)后者为O(nlogn)。

    我们可以看出即便对同一个数组,采用这两种方法构建最大堆,构造出的最大堆也是不一定相同的。 还有一点需要说明,C++语言的数组下标是从0开始的,但是算法的伪代码实现中数组下标是从1开始的。所以父母,左孩子,右孩子的计算公式会稍有不一致。

#include<iostream>
using namespace std;
#define Infinity -1000
/*求一个节点的左孩子,注意由于C语言中下标从0开始*/
int Left(int i,int heaplen)
{
 if(2*i+1<heaplen)
  return 2*i+1;
  else
  return 0;/*如果下标超过堆长,表明此节点没有左孩子*/
 
}
int Right(int i,int heaplen)
{
 if(2*i+2<heaplen)
 return 2*i+2;
 else
 return 0;/*如果下标超过堆长,表明此节点没有右孩子*/
}
void MaxHeapIFY(int a[],int n ,int heaplen,int i)
{
 int l=Left(i,heaplen);
 int r=Right(i,heaplen);
 int max=i;
 if(l!=0&&a[max]<a[l])
  max=l;
 if(r!=0&&a[max]<a[r])
   max=r;
 if(max!=i)
 {
  int temp=a[i];
  a[i]=a[max];
  a[max]=temp;
  MaxHeapIFY(a,n,heaplen,max);
 }
}
void BuildMaxHeap(int a[],int n,int heaplen)
{
 for(int k=heaplen/2-1;k>=0;k--)
 {
  MaxHeapIFY(a,n,heaplen,k);
 } 
}
void HeapSort(int a[],int n,int heaplen)
{

 BuildMaxHeap(a,n,heaplen);
 while(heaplen)
 {
  int temp=a[heaplen-1];
  a[heaplen-1]=a[0];
  a[0]=temp;
  heaplen--; 
  MaxHeapIFY(a,n,heaplen,0);
 }
}
int Parent(int i)
{   if((i+1)/2)
   return (i+1)/2-1;
    else
       return 0;
}
void HeapIncreaseKey(int a[],int i,int key)
{
 if(key<a[i])
 {
  cout<<"error"<<endl;
  return;
 }
   a[i]=key;
   while(i>0&&a[i]>a[Parent(i)])
   {
     int temp=a[i];
  a[i]=a[Parent(i)] ;
  a[Parent(i)]=temp;
  i=Parent(i);
   }
}
void MaxHeapInsert(int a[],int n,int heaplen,int key)
{
 heaplen+=1;
 a[heaplen-1]=Infinity;
 HeapIncreaseKey(a,heaplen-1,key);
}
void BuildMaxHeap2(int a[],int n)
{
 int heaplen=1;
 for(int i=1;i<n;i++)
 {
  MaxHeapInsert(a,n,heaplen,a[i]);
  heaplen++;
 }
}


void Print(int a[],int n)
{
 for(int i=0;i<n;i++)
 {
  cout<<a[i]<<";";
 
 }
  cout<<endl;
}
void main()
{
   int a[7]={4,5,9,3,7,1,2};
   //int b[7]={0,0,0,0,0,0,0};
  // BuildMaxHeap(a,7,7);
 //  Print(a,7);
  BuildMaxHeap2(a,7);
  Print(a,7);
  //  HeapSort(a,7,7);
   //Print(a,7);
    
}


 

原文地址:https://www.cnblogs.com/finallyliuyu/p/1554325.html