您的位置:首页 > 其它

排序算法总结4-堆排序

2013-06-07 16:40 316 查看
堆排序的主要步骤:

1 根据数组,从非叶子结点开始,建立最大(小)堆。

2 交换第一个结点和最后一个结点的数据,此时最后一个结点即为最大(小)值。此时前面n-1个数据重新调整堆。按此循环到结束。

#include<stdio.h>

void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void printout(int a[],int n)
{
int i;
for(i = 0; i < n; i++)
{
printf("%d ",a[i]);
}
printf("\n");
}

void maxheapdown(int a[],int i,int n)//
{
int j,temp;
temp = a[i];
j = 2*i + 1;
while(j < n)
{
if(j + 1 < n && a[j+1] > a[j]) //先在左右孩子中找最大的结点
j++;
if(a[j] > temp)
{
a[i] = a[j];
i = j;
j = 2*i + 1;
//a[i] = temp;
}
if(a[j] <= temp)
break;
}
a[i] = temp;
}
void buildmaxheap(int a[], int n)
{
int i;
for(i = n/2 -1; i >= 0; i--)
{
maxheapdown(a,i,n);
}
printf("build:");
printout(a,n);
}
void maxheapsort(int a[],int n)
{
int i;
for(i = n-1; i >=0; i--)
{
swap(&a[0],&a[i]);
maxheapdown(a,0,i);
}
printout(a,n);
}
int main()
{
int data2[5] = {2,4,3,5,6};
buildmaxheap(data2,5);//先创建堆
maxheapsort(data2,5);
}



复杂度分析

堆排序的最坏时间复杂度O(nlogn)。堆序的平均性能较接近于最坏性能。
由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。
堆排序是就地排序,辅助空间为O(1),
它是不稳定的排序方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: