//堆排序
#include<iostream>
using namespace std;
void BuildMaxHeap(int* A, int len);
void HeadAdjust(int *A,int k,int len) {//调整以k为根的子树
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];
}
void BuildMaxHeap(int* A, int len) {//建立大根堆
for (int i = len / 2; i > 0; i--)//从分支节点向前遍历
{
HeadAdjust(A,i,len);
}
}
void HeapSort(int *A,int len) {//堆排序
BuildMaxHeap(A, len);
for (int i = len; i >1 ; i--) {
A[0] = A[i];//交换第一个和最后一个元素
A[i]= A[1];
A[1] = A[0];
HeadAdjust(A, 1, i-1);//把剩余i-1个元素整理成大根堆
}
}
int main() {
int a[9] = { 0,17,65,53,9,32,78,45,87 };
int i;
cout<<"建立的大根堆:"<<endl;
BuildMaxHeap(a, 8);
for ( i = 1; i < 9; i++)
cout << a[i] << " ";
cout<<"\n堆排序:"<<endl;
HeapSort(a, 8);
for (i = 1; i < 9; i++)
cout << a[i] << " ";
return 0;
}
12-21
5321
07-16
771
05-24
4667