最大ヒープシーケンシャルストレージ操作セット

最大ヒープシーケンシャルストレージ操作セット

typedef struct hnode {
    
    
	int *data;
	int size;
	int maxsize;
}*heap;

最大のヒープのルートノードは、すべてのサブツリーノードよりも大きい

空のヒープの確立


#define maxdata 1000
#define false 0
#define true 1
heap create(int N) {
    
    
	heap h = (heap)malloc(sizeof(struct hnode));
	h->data = (int *)malloc(N * sizeof(int));
	h->maxsize = N;
	h->size = 0;
	h->data[0] = maxdata;   /*定义哨兵大于所有堆中元素,插入从1开始插*/
	return h;
}

int isfull(heap h) {
    
    
	if (h->size == h->maxsize) return true;
	else return false;
}
int isempty(heap h) {
    
    
	if (h->size == 0) return true;
	else return false;
}

最大のヒープの挿入

int insert(heap h, int x) {
    
          /*空缺的为最后结点处,插入值自下而上上滤至合适位置*/
	if (isfull(h)) {
    
     
		printf("堆已满\n"); 
		return 0;
	}
	else {
    
    
		int i = ++h->size;
		for (; h->data[i/2]<x; i /= 2)   h->data[i] = h->data[i / 2];   /*i/2极限情况下为0,必定大于x,直接插入i==1处*/
		/*将插入元素从h->size开始将x依次向上挪,直至小于父节点(i/2),将x插入最后的儿结点(i)*/
		h->data[i] = x;
	}
	return true;
}

最大のヒープ削除

ルートノードを削除します

int deletemax(heap h) {
    
         /*删除最大值根结点为空,取最后一个元素自上而下下滤填入*/
	if (isempty(h)) {
    
    
		printf("none\n");
		return false;
	}
	else {
    
    
		int max = h->data[1];
		int temp = h->data[h->size--];
		int parent, child;
		for (parent = 1; parent * 2 <= h->size; parent = child) {
    
         
		/*确定有左子树*/
			child = parent * 2;
			if (child != h->size && h->data[child] < h->data[child + 1]) child++;     
			/*确定有无右子树,有取左右子结点最大值*/
			else {
    
    
				if (h->data[child] > temp) h->data[parent] = h->data[child];   
				/*temp比儿结点小向下传递,儿结点补到父节点空出位置 parent=空出的child数字填入*/
				else break;
			}
		}
		h->data[parent] = temp;            
		return max;
	}
	
}

最大ヒープ確立

最大ヒープ確立:最初にh-> sizeデータを配列に入力し、次にそれをヒープに調整します。各調整は最小のサブツリーから開始して上向きに調整する必要があります。各調整後、ルートノードはサブツリーの最大値になります。次に、2つのサブツリーをマージします。そのため、毎回ルートノードをフィルタリングし、2つのサブノードのそれよりも大きい要素に置き換えて、適切な位置にフィルタリングするだけで済みます。

void PercDown(heap H, int p)   
{
    
     /* 下滤:将H中以H->Data[p]为根的子堆调整为最大堆 */
	int Parent, Child;
	int X;

	X = H->data[p]; /* 取出根结点存放的值 */
	for (Parent = p; Parent * 2 <= H->size; Parent = Child) {
    
    
		Child = Parent * 2;
		if ((Child != H->size) && (H->data[Child]<H->data[Child + 1]))
			Child++;  /* Child指向左右子结点的较大者 */
		if (X >= H->data[Child]) break; /* 找到了合适位置 */
		else  /* 下滤X */
			H->data[Parent] = H->data[Child];
	}
	H->data[Parent] = X;
}

void BuildHeap(heap H)
{
    
     /* 调整H->Data[]中的元素,使满足最大堆的有序性  */
  /* 这里假设所有H->Size个元素已经存在H->Data[]中 */

	int i;

	/* 从最后一个结点的父节点开始,到根结点1 */
	for (i = H->size / 2; i>0; i--)
		PercDown(H, i);
}

おすすめ

転載: blog.csdn.net/qq_40602655/article/details/106603124