排序之堆排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
堆排序的平均时间复杂度为Ο(nlogn)
。
算法步骤:
1. 创建一个堆H[0..n-1]
2. 把堆首(最大值)和堆尾互换
3.
把堆的尺寸缩小1,是把新的数组顶端数据调整到相应位置
4. 重复步骤2,直到堆的尺寸为1
堆排序代码实现如下:
#include <
stdio.h>
int parent(int i)
{
return i/2;
}
int left(int i)
{
return 2*i+1;
}
int right(int i)
{
return 2*i+2;
}
void exchange(int *a,int
*b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void max_heapify(int
array[],int i,int max)
{
int l;
int r;
int largest;
l=left(i);
r=right(i);
if(l < max&&array[l]
> array[i])
largest=l;
else
largest=i;
if(r < max&&array[r]
> array[largest])
largest=r;
if(largest!=i)
{
exchange(&array[largest],&array[i]);
max_heapify(array,largest,max);
}
}
void build_max_heap(int
array[],int max)
{
int i;
for(i=max/2;i >=
0;i--)
max_heapify(array,i,max);
}
void heapsort(int *array,int
max)
{
int i;
int heapsize=max;
build_max_heap(array,max);
for(i=max-1;i >=
0;i--)
{
exchange(&array[0],&array[i]);
heapsize=heapsize-1;
max_heapify(array,0,heapsize);
}
}
int
main()
{
int i;
int
array[]={5,2,3,4,5,6,7,1,9};
int
length=sizeof(array)/sizeof(array[0]);
printf("处理之前:\n");
for(i=0;i<
length;i++)
{
printf("%d",array[i]);
}
printf("\nBuild之后\n");
build_max_heap(array,length);
for(i=0;i<
length;i++)
{
printf("%d",array[i]);
}
printf("\n排序之后\n");
heapsort(array,length);
for(i=0;i<
length;i++)
{
printf("%d",array[i]);
}
return 0;
}
时间复杂度:
最好O(nlogn);
最坏O(nlogn);
稳定性:不稳定