最大堆:任何一个父节点都比子节点大
最小堆:任何一个父节点都比子节点小
堆排序的步骤分为三步:
一、建立一个堆。
二、将建立的堆整理成最大堆或者最小堆。
三、依次遍历要排序的队列节点,保证每个节点都满足最大堆或者最小堆。
C++示例:
#include <iostream>
using namespace std;
/*
将一个堆转化为最大堆
*/
void maxHeapify(int arr[], int node, int count) {
int left = node * 2 + 1;
int right = node * 2 + 2;
int largest = -1;
if (left < count && arr[left] > arr[node]) {
largest = left;
} else {
largest = node;
}
if (right < count && arr[right] > arr[largest]) {
largest = right;
}
if (largest != node) {
int temp = arr[node];
arr[node] = arr[largest];
arr[largest] = temp;
maxHeapify(arr, largest, count);
}
}
/*
建立一个堆
*/
void buildMaxHeap(int arr[], int count) {
for (int i = (count - 1) / 2; i >= 0; i--) {
maxHeapify(arr, i, count);
}
}
/*
堆排序
*/
void heapSort(int arr[], int count) {
buildMaxHeap(arr, count);
for (int i = count - 1; i >= 1; i--) {
// 最大堆第一个数据最大,将其移动到最后去。
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
maxHeapify(arr, 0, i);
}
}
/*
主函数(入口函数)
*/
int main(int argc, const char * argv[]) {
int arrA[10] = {12,321,42,53,562,11,4,45,63,543};
heapSort(arrA, 10);
for (int i = 0; i < 10; i++) {
cout<< arrA[i] << " ";
}
cout<< endl;
return 0;
}
输出结果:
堆排序的时间复杂度是(nlgn)