题目描述:
对于一个int数组,请编写一个堆排序算法,对数组元素排序。
给定一个int数组A及数组的大小n,请返回排序后的数组。
测试用例:
[1,2,3,5,2,3],6
[1,2,2,3,3,5]
解题思路:
手动过程:
- 将序列按照BFS构造成完全二叉树
- 将二叉树从下往上调整成最大堆
- 将根元素和最后位置的节点交换位置,确定最大元素
- 将少一个节点的二叉树从上往下调整成最大堆,
- 反复步骤3,4;直到结束
代码:
class HeapSort {
public:
int* heapSort(int* A, int n) {
// O()
for(int i=n/2-1;i>=0;i--){
max_heap(A,i,n-1);
}
for(int j=n-1;j>0;j--){
swap(A[j],A[0]);
max_heap(A,0,j-1);
}
return A;
}
void max_heap(int* A,int begin,int end){
int parent = begin;
int child = 2*parent + 1;
int value = A[parent];
while(child <= end){ // 考虑(A,0,1),必须<=;
if(child < end && A[child] < A[child+1])
child++;
if(value < A[child]){
A[parent] = A[child];
parent = child;
child = parent*2 + 1;
}
else
break;
}
A[parent] = value;
}
};
注意:
不可能真的让你去构造一个二叉树,在数组中找规律,确定parent和child