好吧,这次认真看算法导论,正确把每道基础题做会!
堆排序的原理:
1、可以是数组形式,但要注意二叉树本身的特点;
2、首先建立最大堆的时候,要注意可以从第一个非叶子节点开始保持堆的性质;因为叶子节点本身就是单节点的最大堆;非叶节点才需要check是否是最大堆。
3、最后利用最大堆的性质,根节点一定是最大的,不断地把根节点与最右叶节点交换位置,然后再保持堆性质,这样迭代就不断地把局部最大有序地放到了最后,这样就完成了排序。
最后不得不说写这种算法题,利用宏还是不错的选择。我是不是转C编程的节奏。
#include <iostream>
#define Parent(i) (i)/2
#define LeftChild(i) 2*(i)+1
#define RightChild(i) 2*(i)+2
void Exchange(int& a,int& b){
int temp = a;
a = b;
b = temp;
}
void PrintArr(int* array, int size){
for (int i = 0; i < size; ++i){
printf("%d ", array[i]);
}
printf("\n");
}
void MaxHeapify(int* array,const int heapSize, int index){
if (index >= heapSize){
return;
}
int left = LeftChild(index);
if (left >= heapSize){
return;
}
int maxVal = array[left];
int maxIndex = left;
int right = RightChild(index);
if (right < heapSize && array[right] > array[left]){
maxVal = array[right];
maxIndex = right;
}
if (array[maxIndex] > array[index]){
Exchange(array[maxIndex], array[index]);
}
else{
maxIndex = index;
}
if (maxIndex != index){
MaxHeapify(array, heapSize, maxIndex);
}
}
void BuildHeap(int* array, int heapSize){
for (int i = heapSize/2; i >= 0; --i){
MaxHeapify(array, heapSize, i);
}
}
void HeapSort(int* array, const int heapSize){
BuildHeap(array, heapSize);
for (int i = heapSize; i > 0; --i){
Exchange(array[i-1], array[0]);
MaxHeapify(array, i-1, 0);
}
}
int main(){
int array[] = {1,1001,34,56,12,-99,10922,-1111};
const int heapSize = sizeof(array)/sizeof(*array);
HeapSort(array, heapSize);
PrintArr(array, heapSize);
}