堆和堆排序

xiaoxiao2021-02-28  49

一、堆和堆的实现

1.一般都是使用数组来实现,二叉堆(binary heap)是一颗完全二叉树,堆中某个节点的值总是不大于其父节点的值;

//创建一个容量为n-1的堆 索引从1开始int* binary_heap(int n) { int* p = (int*)malloc(n*sizeof(int)); return p;}

二、shift up操作,向最大堆中插入元素

一直和自己的父节点比较,子节点需要小于自己的父节点,不满足则向上升;

//向堆中插入元素 shift upvoid insert(int* heap, int data, int n) { if (heap_node_num + 1 > n) { printf("heap effect.\n"); return; } heap[heap_node_num+1] = data; int num = heap_node_num + 1; while (num > 1 && heap[num] > heap[num / 2]) { _swap(&heap[num], &heap[num / 2]); num /= 2; } heap_node_num++;

}

三、shift down取出元素

取出根元素,即优先级最高的元素,并将最后一个元素放在根结点; //向堆中弹出元素  //即弹出根节点 即优先级最高的数据 int pop(int* heap) { if (heap_node_num < 1)return -1; int pop_data = heap[1]; //将最后一个节点的数据放到根节点中 heap[1] = heap[heap_node_num]; //将根节点依次向子节点比较大小 先找到两个子节点中较大的节点 比较 //存在问题 没有判断左右孩子是否存在 for (int i = 1; i <= heap_node_num;) if (heap[2 * i]>heap[2 * i + 1]) {  if (heap[i] < heap[2 * i]){  _swap(&heap[i], &heap[2 * i]);  i *= 2; } else break; } else { if (heap[i] < heap[2 * i+1]) { _swap(&heap[i], &heap[2 * i+1]); i = 2 * i + 1; } else break; } heap_node_num--; return pop_data;

}

转载请注明原文地址: https://www.6miu.com/read-2620692.html

最新回复(0)