#include<iostream>
using namespace std;
#define LEFT(i) (2*i)
#define RIGHT(i) (2*i+1)
#define PARENT(i) (i>>1)
void EXCHANGE(int &x, int &y){
int temp;
temp = x;
x = y;
y = temp;
}
void max_heapify(int A[], int i, int n){ //维持堆的性质 n下标的最大值 A[0]空出来没用 实际A中的节点为n-1
int l = LEFT(i);
int r = RIGHT(i);
int largest;
if (l <= n && A[l] > A[i])
largest = l;
else
largest = i;
if (r <= n && A[r] > A[largest])
largest = r;
if (largest != i){
EXCHANGE(A[i], A[largest]);
max_heapify(A, largest, n);
}
}
void build_max_heap(int A[], int n){ //建堆 n 表示有几个节点
for (int i = n / 2; i >= 1; i--) //从底向上调整,不能从上向下调整
max_heapify(A, i, n);
}
void heap_sort(int A[], int n){
build_max_heap(A, n);
for (int i = n; i >= 2; i--){
EXCHANGE(A[1], A[i]);
n = n - 1;
max_heapify(A, 1, n);
}
}
int main(){
int A[11] = { 0, 5, 6, 8, 4, 8, 44, 52, 56, 89, 12 };
heap_sort(A, 10);
return 0;
}
堆排序(最大堆)
最新推荐文章于 2023-05-28 11:19:59 发布