您的位置:首页 > 其它

堆排序算法

2011-12-14 23:05 141 查看
堆排序是利用堆进行排序的算法

将待排序的序列构造成一个大顶堆(或小顶堆),此时序列 的最大值就是堆顶的根结点

将其与堆数组中的未尾元素交换,此时未尾元素就是最大 值,然后将剩余的n - 1个序列重新构造成一个大顶堆,如些反复便能得到一个有序的序列

#ifndef HEAPSORT_H
#define HEAPSORT_H
template<class T> void HeapAdjust(T *a,int n,int len) //建立大顶堆
{
T temp = a
;
for(int j = n * 2;j < len;j *= 2)
{
if(j < len - 1 && a[j] < a[j + 1]) //如果结点的左孩子小于右孩子增加j的值
++j; //用于记录较大的结点的下标
if(temp >= a[j]) //如果父结点大于等于两个孩子,则满足大顶堆的定义,跳出循环
break;
a
= a[j];  //否则用较大的结点替换父结点
n = j; //记录下替换父结点的结点下标
}
a
= temp; //把原来的父结点移动到替换父结点的结点位置
}
template<class T> void Swap(T *a,T *b) //交换两个数值
{
T temp = *a;
*a = *b;
*b = temp;
}
template<class T> void HeapSort(T *a,int len) //堆排序算法
{
for(int i = len / 2;i >= 0;--i) //建立大顶堆
HeapAdjust(a,i,len);
for(int i = len - 1;i > 0;--i)
{
Swap(&a[i],&a[0]); //第个元素和最后一个元素进行交换
HeapAdjust(a,0,i); //建立大顶堆
}
}
#endif //HEAPSORT_H


测试代码:

#include "HeapSort.h"
#include <stdio.h>
int main()
{
int a[] = {12,45,34,37,66,15,6,4,17,19,25,35,3,2,1};
int len = sizeof(a) / sizeof(*a);
HeapSort(a,len);
printf("排序后的数组序列为:\n");
for(int i = 0;i < len;++i)
printf("%d ",a[i]);
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: