const int N = 100;
int a[N];
int n;
void adjust(int low,int high){
for(int i=low;i<=high/2;){
int k=2*i;//k暂存较大的孩子节点的下标
if(2*i+1<=high&&a[2*i]<a[2*i+1]){
k=2*i+1;
}
if(a[k]>a[i]){
swap(a[k],a[i]);
i=k;
}
else{
break;
}
}
}
void HeapSort(){
for(int i=n/2;i>=1;i--){
adjust(i,n);
}
for(int i=n;i>=1;i--){
swap(a[1],a[i])
adjust(1,i-1);
}
}下标范围【1,n】都是闭区间
从下标2/n开始到下标1结束,每次都向下调整到叶子节点
每次排序之后把在下标1处的最大值调到数组尾部相应位置,共操作n次,每次调整需logn次,因而时间复杂度O(nlogn)。
本文详细介绍了一种高效的排序算法——堆排序。通过递归地构建最大堆并对堆顶元素与末尾元素交换,实现数组的有序排列。具体展示了调整堆结构的函数及完整的堆排序过程,并分析了其时间复杂度为O(nlogn)。
2278

被折叠的 条评论
为什么被折叠?



