1.什么是堆,堆就是一个完全二叉树,一个数组就可以表示成一个堆,对于下标为i的数组元素来说,PARENT(i)=[i/2](去下整),LEFT(i)=2*i,RIGHT(i)=2*i+1;这样的话就可以把一个数组表示成一个完全二叉树。
对于一个堆(也就是完全二叉树)来说,高度定义就是从根节点到最下层叶子节点所经过的中间边的数量。
1°那么对于一个数目为n的堆来说,他的高度也就是 [lg(n)](下取整)
2°对于一个高度为h的堆来说,他的节点数目范围为【2^h~2^(h+1)-1】:高度为h也就意味着更有h+1层数,前h层都是满的,也就是分别为1,2,2^2,2^3,…,2^(h-1),但是第h+1层可以只有一个叶子,也可以是满的,也就是2^h个元素。
3°一个堆大小为n,其中节点i的子树大小至多为【2n/3】:最大的位置也就是位于根节点的的两棵子树的大小,不妨肯定是左边比右边大,嘴坏情况下,左边为h+1层,而右边为h层,那么左边数目为2^(h+1)-1,那么右边为2^h-1,那么2^(h+1)-1+2^h-1+1=n,那么节点i的子树至多为【2n/3】。
2.堆排序的第一步:建立最大堆
1°MAX-HEAPIFY(A,i),是对i进行处理,默认情况下,i的两个子树都已经是最大堆了,但是存在A[i]<A[LEFT(i)]或者A[i]<A[RIGHT(i)]
过程语言为:
MAX-HEAPIFY(A,i)
-1- l<--- LEFT(i);
-2- r<--- RIGHT(i);
-3- if l<=heap_size(A)&&A[l]>A[i]
-4- then largest <--- l;
-5- else largest <--- i;
-6- if r<=heap_size(A)&&A[r]>A[largest]
-7- then largest <--- r;
-8- if largest != i
-9- exchange A[i]<--->A[largest]
-10- MAX-HEAPIFY(A,largest;)
2°建立最大堆BUILD-MAX-HEAP(A)
-1- heap_size(A)<---length(A);
-2- for i <--- [length[A]/2](下取整) downto 1
-3- do MAX-HEAPIFY(A,i)
3堆排序算法
-1- BUILD-MAX-HEAP(A);
-2- for i <---length(A) downto 2
do exchange A[1] <--->A[i]
heap-size(A)<---heap-size(A)-1
MAX-HEAPIFY(A,1)
源程序:
#include<iostream>
using std::cout;
using std::endl;
int parent(int i)
{
return i/2;
}
void exchange(int* a,int pos1, int pos2)
{
if(pos1 == pos2)
return;
*(a+pos1)=*(a+pos1)^*(a+pos2);
*(a+pos2)=*(a+pos1)^*(a+pos2);
*(a+pos1)=*(a+pos1)^*(a+pos2);
}
int left(int i)
{
return 2*i+1;
}
int right(int i)
{
return 2*i+2;
}
void Max_heap(int * a,int size, int pos)
{
if(pos > size-1)
{
return;
}
int l = left(pos);
int r = right(pos);
int largest;
if(l<size && *(a+l)>*(a+pos))
largest = l;
else
largest = pos;
if(r<size && *(a+r)>*(a+largest))
largest = r;
if (largest != pos)
{
exchange(a,pos,largest);
Max_heap(a,size,largest);
}
}
void Bulid_Max_heap(int *a ,int size)
{
for(int i = (size-1)/2;i>=0;i--)
{
Max_heap(a,size,i);
}
}
void Max_heap_sort(int *a, int size)
{
if(size<=1)
return;
if(size == 2)
{
if(*a>*(a+1))
{
exchange(a,0,1);
return;
}
else
return;
}
Bulid_Max_heap(a,size);
int temp;
int size_temp = size;
for(int i = size-1;i>=1; i--)
{
exchange(a,0,i);
size_temp = size_temp-1;
Max_heap(a,size_temp,0);
}
}
int main()
{
int a[] ={4,9,7,6,17,13,15};
Max_heap_sort(a,7);
for(int i = 0;i<7;i++)
cout<<*(a+i)<<" ";
cout<<endl;
}