static int inc_key(maxHeap* hp,int i,g3Float k) { if (k < hp->heap[i].key) { fprintf(stderr,"New key error in inc_key(mheap)\n"); hp->state = HP_INVALID; return 0; } hp->heap[i].key = k; while((i > 0) && (hp->heap[mh_parent(i)].key < hp->heap[i].key)) { swap_elem(&(hp->heap[mh_parent(i)]),&(hp->heap[i])); i = mh_parent(i); } return 1; }
void merge_nodes(int **adj_list, int *lengths, int adj_list_len, int node_1, int node_2) { int node_1_len; adj_list[node_1] = realloc(adj_list[node_1], (lengths[node_1] + lengths[node_2]) * sizeof(*adj_list[node_1])); if(adj_list[node_1] != NULL) { node_1_len = lengths[node_1]; lengths[node_1] += lengths[node_2]; } else errorp("realloc, adj_list[node_1]"); /* copy connections from node_2 to node_1 */ int i; for(i = 0; i < lengths[node_2]; ++i) adj_list[node_1][node_1_len + i] = adj_list[node_2][i]; /* remove node_2 */ adj_list[node_2] = realloc(adj_list[node_2], 0); lengths[node_2] = 0; /* remove self loops */ for(i = 0; i < lengths[node_1]; ++i) if(adj_list[node_1][i] == node_1 || adj_list[node_1][i] == node_2) { while(adj_list[node_1][ lengths[node_1] - 1 ] == node_1 || adj_list[node_1][ lengths[node_1] - 1 ] == node_2) --lengths[node_1]; if(lengths[node_1] <= i) break; swap_elem(adj_list[node_1], i, lengths[node_1] - 1); --lengths[node_1]; } adj_list[node_1] = realloc(adj_list[node_1], lengths[node_1] * sizeof(*adj_list[node_1])); if(adj_list[node_1] == NULL) errorp("realloc, adj_list[node_1]"); /* replace connections to node_2 to node_1 */ int j; for(i = 0; i < adj_list_len; ++i) if(i != node_1 && i != node_2) for(j = 0; j < lengths[i]; ++j) if(adj_list[i][j] == node_2) adj_list[i][j] = node_1; }
void mheap_sort(maxHeap* hp) { int i,sz; if (hp->state == HP_SORTED) return; if (hp->state != HP_BUILD) mheap_build(hp); sz = hp->size; for(i=(hp->size-1);i>0;i--) { swap_elem(&(hp->heap[0]),&(hp->heap[i])); hp->size--; heapify(hp,0); } hp->size = sz; hp->state = HP_SORTED; }
static void heapify(maxHeap* hp,int i) { int l,r,m; l = mh_left(i); r = mh_right(i); if ((l < hp->size) && (hp->heap[l].key > hp->heap[i].key)) m = l; else m = i; if ((r < hp->size) && (hp->heap[m].key < hp->heap[r].key)) m = r; if (m != i) { swap_elem(&(hp->heap[m]),&(hp->heap[i])); heapify(hp,m); } }