-堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。 需要注意的是排升序要建大堆,排降序建小堆。
堆排序首先要建堆(利用向下调整算法),其次是在堆里面选数(让很节点上的最大数与最后一个叶子上的数交换,然后拿出最后一个数,每拿出一个数,都要进行一次调堆,保证是按有序数列存放在二叉树中)。
//size表示:树的大小
void Adjustdown (int* a, int size,int root){
int parent = root;
inr child = parent*2+1;//默认是左边的孩子。
while (child < size){//当孩子在有效节点范围内时。
if (a[child+1]>a[child] && child+1 < size){
++child;
}
if (a[child]>a[parent]){
Swap (&a[child],&a[parent]);
parent = child;
child = parent*2+1;
}
else{
break;
}
}
}
void HeapSort (int* a, int n){
//建大堆
for (int i=(n-1-1)/2; i>=0; i--){
Adjustdown (a,n,i);
}
// 选数(每次把最大的数调到最后一个位置)
int end = n-1;
while (end>0){
Swap(&a[0],&a[end]);
Adjustdown (a,end,0);//选好一个数以后,要对剩下的数据向下调整,保证有序
end--;
}
}
void Swap (int* x,int* y){
int tmp = *x;
*x = *y;
*y = tmp;
}