上篇博客我们讲解了最大堆的生成,现在,我们可以利用最大堆的性质进行堆排序唉!
1、堆排序:
#include <iostream>
using namespace std;
void adjustHeap(int arr[], int p, int len){
int curNode = arr[p];
int maxChild = 2 * p + 1;
while (maxChild < len){
if (maxChild + 1 < len&&arr[maxChild]<arr[maxChild + 1]){
maxChild++;
}
if (curNode < arr[maxChild]){
arr[p] = arr[maxChild];
p = maxChild;
maxChild = 2 * p + 1;
}
else{
break;
}
}
arr[p] = curNode;
}
void heapSort(int arr[], int len){
for (int i = len / 2 - 1; i >= 0; i--){
adjustHeap(arr, i, len);
}
for (int i = len - 1; i >= 0; i--){
int temp = arr[i];
arr[i] = arr[0];
arr[0] = temp;
adjustHeap(arr, 0, i);
}
}
int main(){
int a[12] = { 10, 234, 124, 5, 3, 45, 5, 4, 2, 1, 3, 54 };
heapSort(a, 12);
for (int i = 0; i < 12; i++){
cout << a[i] << " ";
}
cout << endl;
}
运行结果:
2、大顶堆
#include <iostream>
using namespace std;
#define MAX 10000000
void adjustHeap(int arr[], int p, int curSize){
int curNode = arr[p];
int maxChild = 2 * p + 1;
while (maxChild < curSize){
if (maxChild + 1 < curSize&&arr[maxChild]<arr[maxChild + 1]){
maxChild++;
}
if (curNode < arr[maxChild]){
arr[p] = arr[maxChild];
p = maxChild;
maxChild = 2 * p + 1;
}
else{
break;
}
}
arr[p] = curNode;
}
void heapSort(int arr[], int curSize){
for (int i = curSize / 2 - 1; i >= 0; i--){
adjustHeap(arr, i, curSize);
}
}
void insert(int arr[], int node, int pos, int len){
if (pos < len){
while (pos != 0 && node > arr[(pos - 1) / 2]){
arr[pos] = arr[(pos - 1) / 2];
pos = (pos - 1) / 2;
}
arr[pos] = node;
cout << "插入成功" << endl;
}
else{
return;
}
}
void delMax(int arr[],int curSize){
arr[0] = arr[curSize - 1];
arr[curSize - 1] = MAX;
adjustHeap(arr, 0, curSize - 1);
}
int main(){
int a[15] = { 10, 234, 124, 5, 3, 45, 5, 4, 2, 1, 3, 54,MAX,MAX,MAX };
heapSort(a, 12);
for (int i = 0; i < 12; i++){
cout << a[i] << " ";
}
cout << endl;
cout << "删除节点之后:" << endl;
delMax(a, 12);
for (int i = 0; i < 12; i++){
if (a[i] != MAX){
cout << a[i] << " ";
}
}
cout << endl;
cout << "插入节点之后:" << endl;
insert(a, 1000, 11, 15);
for (int i = 0; i < 15; i++){
if (a[i] != MAX){
cout << a[i] << " ";
}
}
cout << endl;
insert(a, 1500, 12, 15);
for (int i = 0; i < 15; i++){
if (a[i] != MAX){
cout << a[i] << " ";
}
}
cout << endl;
cout << endl;
}
运行结果:
参考博客: