堆:一种数据结构,可以被视为完全二叉树。堆分为最大堆和最小堆,最大堆即每个父节点比子节点大,最小堆反之。结点i的左孩子结点为i<<2,右孩子结点为 i<<2+1;堆排序算法,涉及到建堆和维护堆(具体见代码,不多说)。用堆排序即每次取根节点(一定为最大元素),根节点与最后一个结点对调,最后一个节点退出堆,进行堆的维护,依次进行下去即完成排序。堆排序最坏时间复杂度O(n*logn),平均复杂度接近O(n*logn) ,它是不稳定的排序算法。代码如下:
#include<stdio.h>
const int MAX_SIZE = 20;
int test[MAX_SIZE];
int size,copysize;
void INIT() {
int i;
scanf("%d ",&size);
copysize = size;
for(i = 1; i <= size; i++)
{
scanf("%d ",&test[i]);
}
return;
}
void MAX_HEAPIFY(int i) {
int l,r,largest,tmp;
l = i<<1;
r = (i<<1) + 1;
if(l <= size && test[l] > test[i])
largest = l;
else
largest = i;
if(r <= size && test[r] > test[largest])
largest = r;
if(largest != i)
{
tmp = test[i];
test[i] = test[largest];
test[largest] = tmp;
MAX_HEAPIFY(largest);
}
return ;
}
void BUILD_MAX_HEAP()
{
int i = size/2;
for(; i > 0; i--)
{
MAX_HEAPIFY(i);
}
}
void HEAP_SORT()
{
int tmp;
while(size > 1)
{
BUILD_MAX_HEAP();
tmp = test[size];
test[size] = test[1];
test[1] = tmp;
size--;
}
return;
}
void PRINTF()
{
int i;
for(i = 1; i <= copysize; i++)
{
printf("%d ",test[i]);
}
return;
}
void main ()
{
freopen("input.txt","r",stdin);
INIT();
HEAP_SORT();
PRINTF();
}
const int MAX_SIZE = 20;
int test[MAX_SIZE];
int size,copysize;
void INIT() {
int i;
scanf("%d ",&size);
copysize = size;
for(i = 1; i <= size; i++)
{
scanf("%d ",&test[i]);
}
return;
}
void MAX_HEAPIFY(int i) {
int l,r,largest,tmp;
l = i<<1;
r = (i<<1) + 1;
if(l <= size && test[l] > test[i])
largest = l;
else
largest = i;
if(r <= size && test[r] > test[largest])
largest = r;
if(largest != i)
{
tmp = test[i];
test[i] = test[largest];
test[largest] = tmp;
MAX_HEAPIFY(largest);
}
return ;
}
void BUILD_MAX_HEAP()
{
int i = size/2;
for(; i > 0; i--)
{
MAX_HEAPIFY(i);
}
}
void HEAP_SORT()
{
int tmp;
while(size > 1)
{
BUILD_MAX_HEAP();
tmp = test[size];
test[size] = test[1];
test[1] = tmp;
size--;
}
return;
}
void PRINTF()
{
int i;
for(i = 1; i <= copysize; i++)
{
printf("%d ",test[i]);
}
return;
}
void main ()
{
freopen("input.txt","r",stdin);
INIT();
HEAP_SORT();
PRINTF();
}
转载于:https://blog.51cto.com/aiguozhe/797198