本文实现了堆排序算法,它在最小生成树以及最短路径算法中都有应用。
堆是一种简单的数据结构它满足一个基本的性质,将堆对应于一个二叉树,那么该树中每一个节点都比它的左子树的key值大,而比它的右子树的key值小.
对于基本类型的堆,一般用数组实现就可以.
下图中是从《算法导论(第二版)》中摘抄的一个例子
堆排序的时间复杂度为O(nlgn).
有关代码的更多内容可以参考算法导论第二版.
我这里有算法导论第二版英文版的电子书,需要的可以给我留言
代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define MAX 100
int size;
int MAX_Heapify(int A[],int i)
{
int l,r,largest;
//size = sizeof(A)/sizeof(int);
l = i*2+1;
r = i*2 + 2;
if(l < size && A[l] > A[i])
largest = l;
else
largest = i;
if(r < size && A[r] > A[largest])
largest = r;
if(largest != i)
{
int tmp = A[i];
A[i] = A[largest];
A[largest] = tmp;
MAX_Heapify(A,largest);
}
return 0;
}
int build_heap(int A[])
{
int i;
//size = sizeof(A)/sizeof(int);
for(i = (size-1)/2;i>=0;i--)
MAX_Heapify(A,i);
return 0;
}
int heap_sort(int A[])
{
int i,tmp;
//size = sizeof(A)/sizeof(int);
build_heap(A);
for(i = size-1;i>0;i--)
{
tmp = A[0];
A[0] = A[i];
A[i]=tmp;
size--;
MAX_Heapify(A,0);
}
return 0;
}
int print_heap(int a[])
{
int i,ov = 0;
for(i = 0;;i++)
{
int k = (int)pow(2,i),j;
for(j = 0;j<k;j++)
{
if((k+j)<size)
{
printf("%d\t",a[k+j]);
}
else
{
ov = 1;
break;
}
}
if(ov )
{
break;
}
}
return 0 ;
}
int test()
{
int a[MAX],i;
srand((int)time(0));
for(i = 0;i<MAX;i++)
{
a[i] = rand();
printf("%d\t",a[i]);
}
size = sizeof(a)/sizeof(int);
printf("\n\nresult:\n");
heap_sort(a);
//print_heap(a);
size = sizeof(a)/sizeof(int);
for(i=0;i<MAX;i++)
printf("%d\t",a[i]);
return 0;
}
int main()
{
test();
return 0;
}
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define MAX 100
int size;
int MAX_Heapify(int A[],int i)
{
int l,r,largest;
//size = sizeof(A)/sizeof(int);
l = i*2+1;
r = i*2 + 2;
if(l < size && A[l] > A[i])
largest = l;
else
largest = i;
if(r < size && A[r] > A[largest])
largest = r;
if(largest != i)
{
int tmp = A[i];
A[i] = A[largest];
A[largest] = tmp;
MAX_Heapify(A,largest);
}
return 0;
}
int build_heap(int A[])
{
int i;
//size = sizeof(A)/sizeof(int);
for(i = (size-1)/2;i>=0;i--)
MAX_Heapify(A,i);
return 0;
}
int heap_sort(int A[])
{
int i,tmp;
//size = sizeof(A)/sizeof(int);
build_heap(A);
for(i = size-1;i>0;i--)
{
tmp = A[0];
A[0] = A[i];
A[i]=tmp;
size--;
MAX_Heapify(A,0);
}
return 0;
}
int print_heap(int a[])
{
int i,ov = 0;
for(i = 0;;i++)
{
int k = (int)pow(2,i),j;
for(j = 0;j<k;j++)
{
if((k+j)<size)
{
printf("%d\t",a[k+j]);
}
else
{
ov = 1;
break;
}
}
if(ov )
{
break;
}
}
return 0 ;
}
int test()
{
int a[MAX],i;
srand((int)time(0));
for(i = 0;i<MAX;i++)
{
a[i] = rand();
printf("%d\t",a[i]);
}
size = sizeof(a)/sizeof(int);
printf("\n\nresult:\n");
heap_sort(a);
//print_heap(a);
size = sizeof(a)/sizeof(int);
for(i=0;i<MAX;i++)
printf("%d\t",a[i]);
return 0;
}
int main()
{
test();
return 0;
}

浙公网安备 33010602011771号