#include#include #define PARENT(num) ((num)>>1) #define LEFt(num) ((num)<<1) #define RIGHt(num) ((num<<1)+1) void build_max_heap(int* A, int size); void max_heapify(int* A, int i, int heap_size); int extract_max(int* A, int* size); void insert(int** A, int x, int* size); void display(int* num, int size); void main() { int* num = (int*)malloc(40); int t[10]={5, 3, 5, -2, 4, 6, 7, 4, -1, 3}; if (!num) { printf("error"); exit(1); } for (int i = 0; i < 10; i++) { *(num + i) = t[i]; } int size = 10; build_max_heap(num, size); display(num, size); extract_max(num, &size); display(num, size); insert(&num, 2, &size); display(num, size); } void max_heapify(int* A, int i, int heap_size) { int l = LEFt(i), r = RIGHt(i); int largest; if (l <= heap_size && A[l - 1] > A[i - 1]) largest = l; else largest = i; if (r <= heap_size && A[r - 1] > A[largest - 1]) largest = r; if (largest != i) { int t = A[i - 1]; A[i - 1] = A[largest - 1]; A[largest - 1] = t; max_heapify(A, largest, heap_size); } } void build_max_heap(int* A, int size) { int heap_size = size; for (int i = size / 2; i >= 1; i--) { max_heapify(A, i, heap_size); } } //返回具有最大关键字的元素 int maximun(int* num) { return num[0]; } //返回并删除具有最大关键字的元素 int extract_max(int* A, int* size) { int heap_size = --(*size); int t = A[0]; A[0] = A[*size]; A[*size] = t; max_heapify(A, 1,heap_size); return A[*size]; } //将x插入队列 void insert(int** A, int x,int* size) { int* num = (int*)malloc((*size) * 4 + 4); if (!num) { printf("errorn"); exit(1); } for (int i = 0; i < *size; i++) { *(num+i) = *((*A)+i); } *(num+(*size)) = x; *A = num; int t = (*size) + 1; (*size)++; while (t > 1) { t = PARENT(t); max_heapify(*A, t, *size); } } void display(int* num, int size) { for (int i = 0; i < size; i++) { printf("%d ", num[i]); } printf("n"); }



