堆排序

堆排序:

什麼是堆:是一種數據結構,邏輯上市一個完全二叉樹,存儲上個是個數組

性質:兩種堆,最小堆和最大堆。任意結點的key值都比他的孩子結點所有孩子結點的key值大

完全二叉樹:除了葉子結點的那一層,其他層都是滿的,而且葉子結點的排布是從左到右排的

 

存儲:逐層按從左到右的順序存儲在數組中。Size,length    size<=length   數組最後一個元素的下表就是size,分配的空間是length

用途:堆排序、優先級隊列

 

堆的基本操作:

  1. 給定任一數組,建立一個堆

  2. 優先級隊列

  3. 性能:lgn



代碼:

#include <iostream>

#include <limits.h>

#include <string.h>

#define MAMN 1000

using namespace std;

 

//對於子堆進行交換,形成子堆的最大堆

void MAX_HEAPIFY(int *A , int i , int size)

{

    int l = 2*i;

    int r = 2*i+1;

    int largest=0;

 

   if(l<=size&&A[l]>A[i])

        largest = l;

    else

        largest = i;

   if(r<=size&&A[r]>A[largest])

        largest = r;

    if(largest!=i){

        swap(A[i] , A[largest]);

        MAX_HEAPIFY(A,largest,size);

    }

}

 

//建立一個最大堆

void BUILD_MAX_HEAP(int *A,int size)

{

    for(int i=size/2 ; i>=1 ;i--)//且是從size/2開始,這是前任總結出來的規律

        MAX_HEAPIFY(A,i,size);

}

 

//進行排序!!

void HEAPSORT(int *A,int size)

{

    int len = size;

 

    BUILD_MAX_HEAP(A,len);

    for(int i=len ; i>0 ; i--){

        swap(A[1],A[i]);

        len-=1;

        MAX_HEAPIFY(A , 1 , len);

    }

}

 

int main()

{

    int i=0,j=0;

    int temp;

    int *p;

    int A[MAMN];

    int size=0;

 

    while(cin >> size){

        for(i=1 ; i<=size ; i++){

            cin >> A[i];

        }

 

        HEAPSORT(A,size);

 

        for(i=1 ; i<=size ; i++){

            cout << A[i]<< " ";

        }

 

        cout << endl;

    }

    return 0;

}

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章