アルゴリズムの導論の第6章のスタックの順序付けの与えた偽のコードの変換の具体的なプログラム

15526 ワード

まず自分で書いたクラスのないC++コードをshowします.
#include <iostream>
using namespace std;
const length=100;
int A[length]={1,9,10,2,7,5,6,4,13,3,18,11,100};
int Heap_size(int A[]);//                0       。
int heap_size=Heap_size(A);
int PARENT(int i);//   
int LEFT(int i);//     
int RIGHT(int i);//     
void MAX_HEAPIFY(int A[],int i);//     
void BUILD_MAX_HEAP(int A[]);//     
void Print(int A[]);
void Print1(int A[]);
void HEAPSORT(int A[]);//     
int MAXIMUM(int A[]);
int HEAP_EXTRACT_MAX(int A[]);//           。
void HEAP_INCREASE_KEY(int A[],int i,int key);// i        key
void MAX_HEAP_INSERT(int A[],int key);
void main()
{
    int A[length]={1,9,10,2,7,5,6,4,13,3,18,11,100};
    cout<<"     :"<<endl;
    Print(A);
    cout<<"     :"<<endl;
    BUILD_MAX_HEAP(A);
    Print(A);
    cout<<"            :"<<endl;
    HEAP_EXTRACT_MAX(A);
    Print(A);
    cout<<"    8      15:"<<endl;
    HEAP_INCREASE_KEY(A,8,15);
    Print(A);
    cout<<"         56:"<<endl;
    MAX_HEAP_INSERT(A,56);
    Print(A);
    cout<<"          :"<<endl;
    HEAPSORT(A);
    Print1(A);
}
int PARENT(int i)
{
    return (i-1)/2;
}
int LEFT(int i)
{
    return 2*i+1;
}
int RIGHT(int i)
{
    return 2*i+2;
}
void MAX_HEAPIFY(int A[],int i)
{
    int largest=0;
    int L=LEFT(i);
    int R=RIGHT(i);
    if (L<heap_size&&A[L]>A[i])
    {
        largest=L;
    }
    else largest=i;
    if (R<heap_size&&A[R]>A[largest])
    {
        largest=R;
    }
    if (largest!=i)
    {
        swap(A[i],A[largest]);
        MAX_HEAPIFY(A,largest);
    }
}
void BUILD_MAX_HEAP(int A[])
{
    int heap_size=length;
    for (int i=length/2;i>=0;i--)
    {
        MAX_HEAPIFY(A,i);
    }
}
void HEAPSORT(int A[])
{
    BUILD_MAX_HEAP(A);
    for (int i=Heap_size(A)-1;i>=0;i--)
    {
        swap(A[0],A[i]);
        heap_size--;
        MAX_HEAPIFY(A,0);
    }
}
int MAXIMUM(int A[])
{
    return A[0];
}
int HEAP_EXTRACT_MAX(int A[])
{
    if (heap_size<0)
    {
        cout<<"heap underflow"<<endl;  
        exit(0); 
    }
    int max=A[0];
    A[0]=A[heap_size-1];
    heap_size--;
    MAX_HEAPIFY(A,0);
    A[heap_size]=0;
    return max;
}
void HEAP_INCREASE_KEY(int A[],int i,int key)
{
    if (key<A[i])
    {
        return ;
    }
    A[i]=key;
    while (i>0&&A[PARENT(i)]<A[i])
    {
        swap(A[i],A[PARENT(i)]);
        i=PARENT(i);
    }
}
void MAX_HEAP_INSERT(int A[],int key)
{
    heap_size++;
    A[heap_size-1]=-0x7fffffff;
    HEAP_INCREASE_KEY(A,heap_size-1,key);
}
int Heap_size(int A[])
{
    for (int i=length-1;i>=0;i--)
    {
        if (A[i]>0)
        {
            return i+1;
        }
    }
    return -1;
}
void Print(int A[])
{
    for (int i=0;i<heap_size;i++)
    {
        if(A[i]>0)
            cout<<A[i]<<" ";
    }
    cout<<endl;
}
void Print1(int A[])
{
    for (int i=0;i<length;i++)
    {
        if(A[i]>0)
            cout<<A[i]<<" ";
    }
    cout<<endl;
}

このコードは境界問題を完全に無視しているので、いくつかの間違いをもたらしました.
以下は私がネットユーザーからもらったコードに基づいて変更し、複数の関数の境界/条件を調整した後、クラスの方法で完璧に解決しました.
//     
/*#include <iostream>   
using namespace std;   
//     
#define N 1000  
#define PARENT(i) (i)>>1  
#define LEFT(i) (i)<<1  
#define RIGHT(i) ((i)<<1)+1  
  
class Heap  
{  
public:  
    //      
    int A[N+1];  
    int length;  
    int heap_size;  
    //       
    Heap(){}  
    Heap(int size):length(size),heap_size(size){}  
    ~Heap(){}  
    //      
    void Max_Heapify(int i);  
    void Build_Max_Heap();  
    void HeapSort(int A[]);  
    //        
    void Heap_Increase_Key(int i, int key);  
    void Max_Heap_Insert(int key);  
    int Heap_Maximum();  
    int Heap_Extract_Max();  
    void Heap_Delete(int i); 
    //      
    void Print(); 
    void Print1();
};  
  
//  i            ,       i         ,   O(lgn)  
//      
void Heap::Max_Heapify(int i)  
{  
    //Print();  
    int l = LEFT(i), r = RIGHT(i), largest;  
    //  i、i  、i               
    if(l < heap_size && A[l] > A[i])  
        largest = l;  
    else largest = i;  
    if(r < heap_size && A[r] > A[largest])  
        largest = r;  
    //     ,        ,      
    //    
    if(largest != i)  
    {  
        //            
        swap(A[i], A[largest]);  
        //          ,        
        Max_Heapify(largest);  
    }  
}  
  
//  ,   O(nlgn)  
void Heap::Build_Max_Heap()  
{  
    heap_size = length;  
    //           ,        ,         
    for(int i = length / 2; i >= 0; i--)  
        Max_Heapify(i);  
}  
  
//   ,   O(nlgn)  
void Heap::HeapSort(int A[])  
{  
    //         
    Build_Max_Heap();  
    //    i          
    for(int i = length-1; i >= 1; i--)  
    {  
        //  i           A[i]   
        swap(A[0], A[i]);  
        //        
        heap_size--;  
        //               
        Max_Heapify(0);  
    }  
}  
  
//   i       key,  key>=A[i]  
void Heap::Heap_Increase_Key(int i, int key)  
{  
    if(key < A[i])  
    {  
        cout<<"new key is smaller than current key"<<endl;  
        exit(0);  
    }  
    A[i] = key;  
    //    , A[PARENT(i)]<A[i],     
    //         A[PARENT(i)]<A[i],       
    while(A[PARENT(i)] > 0 && A[PARENT(i)] < A[i])  
    {  
        swap(A[PARENT(i)], A[i]);  
        i = PARENT(i);  
    }  
}  
  
// key     A   
void Heap::Max_Heap_Insert(int key)  
{  
    if(heap_size == N)  
    {  
        cout<<"heap is full"<<endl;  
        exit(0);  
    }  
    heap_size++;length++;  
    A[heap_size-1] = -0x7fffffff;  
    Heap_Increase_Key(heap_size-1, key);  
}  
//  A      ,  O(1)  
int Heap::Heap_Maximum()  
{  
    return A[0];  
}  
//     A      ,  O(lgn)  
int Heap::Heap_Extract_Max()  
{  
    if(heap_size < 0)  
    {  
        cout<<"heap underflow"<<endl;  
        exit(0);  
    }  
    //       
    int max = A[0];  
    //                 
    A[0] = A[heap_size-1];  
    heap_size--;  
    //         
    Max_Heapify(0);  
    //       
    return max;  
}  
//     i     
void Heap::Heap_Delete(int i)  
{  
    if(i > heap_size)  
    {  
        cout<<"there's no node i"<<endl;  
        exit(0);  
    }  
    //          i        
    int key = A[heap_size-1];  
    heap_size--;  
    //      A[i] ,       
    if(key > A[i])  
        Heap_Increase_Key(i, key);  
    else//  ,      
    {  
        A[i] = key;  
        Max_Heapify(i);
        A[heap_size]=0;
    }  
}  
  
void Heap::Print()  
{  
    int i;  
    for(i = 0; i < heap_size; i++)  
    {  
        if(i > 0)cout<<',';  
        else cout<<"==> A = {";  
        cout<<A[i];  
    }  
    cout<<'}'<<endl;  
} 
void Heap::Print1()
{
    int i; 
    cout<<"==> A = {";
    for(i = 0; i < length; i++)  
    {  
        if (A[i]>0)
        {
            cout<<A[i]<<" ";
        }
    }  
    cout<<'}'<<endl; 
}
void main()
{
    Heap a(13);
    a.A[0]=1;a.A[1]=9;a.A[2]=10;a.A[3]=2;a.A[4]=7;
    a.A[5]=5;a.A[6]=6;a.A[7]=4;a.A[8]=13;a.A[9]=3;
    a.A[10]=18;a.A[11]=11;a.A[12]=100;
    a.Build_Max_Heap();
    a.Print();
    a.Heap_Delete(2);
    a.Print();
    a.Heap_Extract_Max();
    a.Print();
    a.Heap_Increase_Key(8,15);
    a.Print();
    a.Max_Heap_Insert(56);
    a.Print();
    a.HeapSort(a.A);
    a.Print1();
}

以下は6.5-3課後の問題の引用の最小の山の問題です
以下はクラスを持たないC++コードです
#include <iostream>
using namespace std;
const length=100;
int A[length]={1,9,10,2,7,5,6,4,13,3,18,11,100};
int PARENT(int i);//   
int LEFT(int i);//     
int RIGHT(int i);//     
void MIN_HEAPIFY(int A[],int i);//     
void BUILD_MIN_HEAP(int A[]);//     
void Print(int A[]);
void Print1(int A[]);
int Heap_size(int A[]);//                0       。void HEAPSORT(int A[]);//     
void HEAPSORT(int A[]);
int MINIMUM(int A[]);
int HEAP_EXTRACT_MIN(int A[]);//           。
void HEAP_INCREASE_KEY(int A[],int i,int key);// i        key
void MIN_HEAP_INSERT(int A[],int key);
int heap_size=Heap_size(A);
void main()
{
    cout<<"     :"<<endl;
    Print(A);
    cout<<"     :"<<endl;
    BUILD_MIN_HEAP(A);
    Print(A);
    cout<<"            :"<<endl;
    HEAP_EXTRACT_MIN(A);
    Print(A);
    cout<<"    8      15:"<<endl;
    HEAP_INCREASE_KEY(A,8,15);
    Print(A);
    cout<<"         56:"<<endl;
    MIN_HEAP_INSERT(A,56);
    Print(A);
    cout<<"          :"<<endl;
    HEAPSORT(A);
    Print1(A);
}
int PARENT(int i)
{
    return (i-1)/2;
}
int LEFT(int i)
{
    return 2*i+1;
}
int RIGHT(int i)
{
    return 2*i+2;
}
void MIN_HEAPIFY(int A[],int i)
{
    int largest=0;
    int L=LEFT(i);
    int R=RIGHT(i);
    if (L<heap_size&&A[L]<A[i])
    {
        largest=L;
    }
    else largest=i;
    if (R<heap_size&&A[R]<A[largest])
    {
        largest=R;
    }
    if (largest!=i)
    {
        swap(A[i],A[largest]);
        MIN_HEAPIFY(A,largest);
    }
}
void BUILD_MIN_HEAP(int A[])
{
    int heap_size=length;
    for (int i=length/2;i>=0;i--)
    {
        MIN_HEAPIFY(A,i);
    }
}
void HEAPSORT(int A[])
{
    BUILD_MIN_HEAP(A);
    for (int i=Heap_size(A)-1;i>=1;i--)
    {
        swap(A[0],A[i]);
        heap_size--;
        MIN_HEAPIFY(A,0);
    }
}
int MINIMUM(int A[])
{
    return A[0];
}
int HEAP_EXTRACT_MIN(int A[])
{
    if (heap_size<0)
    {
        cout<<"heap underflow"<<endl;  
        exit(0); 
    }
    int min=A[0];
    A[0]=A[heap_size-1];
    heap_size--;
    MIN_HEAPIFY(A,0);
    A[heap_size]=0;
    return min;
}
void HEAP_INCREASE_KEY(int A[],int i,int key)
{
    if (key<A[i])
    {
        return ;
    }
    A[i]=key;
    while (i>0&&A[PARENT(i)]>A[i])
    {
        swap(A[i],A[PARENT(i)]);
        i=PARENT(i);
    }
}
void MIN_HEAP_INSERT(int A[],int key)
{
    heap_size++;
    A[heap_size-1]=-0x7fffffff;
    HEAP_INCREASE_KEY(A,heap_size-1,key);
}
int Heap_size(int A[])
{
    for (int i=length-1;i>=0;i--)
    {
        if (A[i]>0)
        {
            return i+1;
        }
    }
    return -1;
}
void Print(int A[])
{
    for (int i=0;i<heap_size;i++)
    {
        if(A[i]>0)
         cout<<A[i]<<" ";
    }
    cout<<endl;
}
void Print1(int A[])
{
    for (int i=0;i<length;i++)
    {
        if(A[i]>0)
            cout<<A[i]<<" ";
    }
    cout<<endl;
}

次はクラス付きC++最小スタックコードです.
//     
/*#include <iostream>   
using namespace std;   
//     
#define N 1000  
#define PARENT(i) (i)>>1  
#define LEFT(i) (i)<<1  
#define RIGHT(i) ((i)<<1)+1  
  
class Heap  
{  
public:  
    //      
    int A[N+1];  
    int length;  
    int heap_size;  
    //       
    Heap(){}  
    Heap(int size):length(size),heap_size(size){}  
    ~Heap(){}  
    //      
    void Min_Heapify(int i);  
    void Build_Min_Heap();  
    void HeapSort(int A[]);  
    //        
    void Heap_Increase_Key(int i, int key);  
    void Min_Heap_Insert(int key);  
    int Heap_Minimum();  
    int Heap_Extract_Min();  
    void Heap_Delete(int i);  
    //      
    void Print();  
    void Print1();
};  
  
//  i            ,       i         ,   O(lgn)  
//      
void Heap::Min_Heapify(int i)  
{  
    //Print();  
    int l = LEFT(i), r = RIGHT(i), largest;  
    //  i、i  、i               
    if(l < heap_size && A[l] < A[i])  
        largest = l;  
    else largest = i;  
    if(r < heap_size && A[r] < A[largest])  
        largest = r;  
    //     ,        ,      
    //    
    if(largest != i)  
    {  
        //            
        swap(A[i], A[largest]);  
        //          ,        
        Min_Heapify(largest);  
    }  
}  
  
//  ,   O(nlgn)  
void Heap::Build_Min_Heap()  
{  
    heap_size = length;  
    //           ,        ,         
    for(int i = length / 2; i >= 0; i--)  
        Min_Heapify(i);  
}  
  
//   ,   O(nlgn)  
void Heap::HeapSort(int A[])  
{  
    //         
    Build_Min_Heap();  
    //    i          
    for(int i = length-1; i >= 1; i--)  
    {  
        //  i           A[i]   
        swap(A[0], A[i]);  
        //        
        heap_size--;  
        //               
        Min_Heapify(0);  
    }  
}  
  
//   i       key,  key>=A[i]  
void Heap::Heap_Increase_Key(int i, int key)  
{  
    if(key < A[i])  
    {  
        cout<<"new key is smaller than current key"<<endl;  
        exit(0);  
    }  
    A[i] = key;  
    //    , A[PARENT(i)]<A[i],     
    //         A[PARENT(i)]>A[i],       
    while(A[PARENT(i)] > 0 && A[PARENT(i)] > A[i])  
    {  
        swap(A[PARENT(i)], A[i]);  
        i = PARENT(i);  
    }  
}  
  
// key     A   
void Heap::Min_Heap_Insert(int key)  
{  
    if(heap_size == N)  
    {  
        cout<<"heap is full"<<endl;  
        exit(0);  
    }  
    heap_size++;length++;  
    A[heap_size-1] = -0x7fffffff;  
    Heap_Increase_Key(heap_size-1, key);  
}  
//  A      ,  O(1)  
int Heap::Heap_Minimum()  
{  
    return A[0];  
}  
//     A      ,  O(lgn)  
int Heap::Heap_Extract_Min()  
{  
    if(heap_size < 0)  
    {  
        cout<<"heap underflow"<<endl;  
        exit(0);  
    }  
    //       
    int min = A[0];  
    //                 
    A[0] = A[heap_size-1];  
    heap_size--;  
    //         
    Min_Heapify(0);  
    //       
    return min;  
}  
//     i     
void Heap::Heap_Delete(int i)  
{  
    if(i > heap_size)  
    {  
        cout<<"there's no node i"<<endl;  
        exit(0);  
    }  
    //          i        
    int key = A[heap_size-1];  
    heap_size--;  
    //      A[i] ,       
    if(key < A[i])  
        Heap_Increase_Key(i, key);  
    else//  ,      
    {  
        A[i] = key;  
        Min_Heapify(i);
        A[heap_size]=0;//         0。           HeapSort    。
    }  
}  
  
void Heap::Print()  
{  
    int i;  
    for(i = 0; i < heap_size; i++)  
    {  
        if(i > 0)cout<<',';  
        else cout<<"==> A = {";  
        cout<<A[i];  
    }  
    cout<<'}'<<endl;  
} 
void Heap::Print1()
{
    int i; 
    cout<<"==> A = {";
    for(i = 0; i < length; i++)  
    {  
        if (A[i]>0)
        {
             cout<<A[i]<<" ";
        }
    }  
    cout<<'}'<<endl; 
}
void main()
{
    Heap a(13);
    a.A[0]=1;a.A[1]=9;a.A[2]=10;a.A[3]=2;a.A[4]=7;
    a.A[5]=5;a.A[6]=6;a.A[7]=4;a.A[8]=13;a.A[9]=3;
    a.A[10]=18;a.A[11]=11;a.A[12]=100;
    a.Build_Min_Heap();
    a.Print();
    a.Heap_Delete(2);
    a.Print();
    a.Heap_Extract_Min();
    a.Print();
    a.Heap_Increase_Key(8,15);
    a.Print();
    a.Min_Heap_Insert(10);
    a.Print();
    a.HeapSort(a.A);
    a.Print1();//            ,           ,
}