介绍
是利用堆这种数据结构所设计的一种排序算法
源代码
#include<bits/stdc++.h>
using namespace std;
void Swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
/*
函数:对一个节点使其调整到堆的相应的位置上
第一个参数:用数组表示的堆
第二个参数:数组元素大小
第三个参数:待调整的节点位置
*/
void adjustHeap(int a[],int n,int i){
int father = i;
int child = i<<1;//左孩子
while (child<=n)
{
if(child<n&&a[child]<a[child+1])child++;
if(a[father]>=a[child])break;
Swap(a[father],a[child]);
father=child;
child = father<<1;
}
}
/*
函数:用一个数组建立大根堆
第一个参数:数组,从数组索引1开始
第二个参数:数组元素大小
*/
void buildHeap(int a[],int n){
//从最后一个非叶子节点开始调整
for(int i=n>>1;i>=1;i--)adjustHeap(a,n,i);
}
/*
函数:堆排序,返回一个从小到大的数组
第一个参数:数组,从数组索引1开始
第二个参数:数组元素大小
*/
void heapSort(int a[],int n){
buildHeap(a,n);
for(int i=n;i>1;i--){
Swap(a[i],a[1]);
adjustHeap(a,i-1,1);
}
}
int main(){
int a[]={0,1,2,42,834,241,1345,53,2453};
int n = sizeof(a)/sizeof(int)-1;
heapSort(a,n);
for(int i=1;i<=n;i++)printf("%d ",a[i]);
}
测试输出
1 2 42 53 241 834 1345 2453