堆排序:
什麼是堆:是一種數據結構,邏輯上市一個完全二叉樹,存儲上個是個數組
性質:兩種堆,最小堆和最大堆。任意結點的key值都比他的孩子結點所有孩子結點的key值大
完全二叉樹:除了葉子結點的那一層,其他層都是滿的,而且葉子結點的排布是從左到右排的
存儲:逐層按從左到右的順序存儲在數組中。Size,length size<=length 數組最後一個元素的下表就是size,分配的空間是length
用途:堆排序、優先級隊列
堆的基本操作:
-
給定任一數組,建立一個堆
-
優先級隊列
-
性能: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;
}