排序之堆排序

堆排序(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);
稳定性:不稳定
posted @ 2014-03-31 21:15  dreamsyeah  阅读(120)  评论(0编辑  收藏  举报