问题描述
堆排序
代码
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>
#define N 100001
using namespace std;
void HeapSort(int a[],int len);
void BuildMaxHeap(int a[],int len);
void AdjustDown(int a[],int k,int len);
int main(void) {
int n;
int a[N];
scanf("%d",&n);
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
}
HeapSort(a,n);
for(int i=1; i<=n; i++) {
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
void HeapSort(int a[],int len){
BuildMaxHeap(a,len);//初始建堆
for(int i=len;i>1;i--){//n-1趟的交换和建堆过程
swap(a[i],a[1]);//输出堆顶元素(和堆底元素交换)
AdjustDown(a,1,i-1);//整理,把剩余i-1个元素整理成堆
}
}
void BuildMaxHeap(int a[],int len){
for(int i=len/2;i>0;i--){
AdjustDown(a,i,len);
}
}
void AdjustDown(int a[],int k,int len){
a[0]=a[k];
for(int i=2*k;i<=len;i*=2){
if(i<len&&a[i]<a[i+1]){
i++;
}
if(a[0]>a[i]){
break;
}else{
a[k]=a[i];
k=i;
}
}
a[k]=a[0];//被筛选结点的值放入 最终位置
}
运行结果
思想