c 언어는 가장 많은 기본 기능을 실현한다

2915 단어
가장 많은 성명:
typedef struct{
	int *data;
	int size;
	int capacity;
}heap,*Maxheap;

주의: (1).하나의 그룹으로 최대 더미를 저장하고 int*data로 그룹을 설명합니다
(2).size 는 현재 용량,capacity 는 최대 용량
가장 많은 생성:
Maxheap create(int MaxSize){
	Maxheap h=(Maxheap)malloc(sizeof(heap));
	h->data=(int *)malloc((MaxSize+1)*sizeof(int));
	h->size=0;
	h->capacity=MaxSize;
	h->data[0]=MAXDATA;
	return h;
}

주의: (1).데이터 그룹은 바늘로 설명하기 때문에 메모리 공간을 분배해야 합니다. 보초병이 한 명 더 있기 때문에 (maxsize+1)*sizeof(int)는 총 바이트수입니다. 마지막에 int로 변환됩니다.*
(2).처음에 데이터가 없으면size는 0이고, 보초병은 포함되지 않으며, 보초병은 인덱스 0의 위치에 저장됩니다.
가장 많은 삽입:
void insert(Maxheap h,int x){
	int i;
	if(isFull(h)){
		printf("full
"); return; } i=++h->size; for(;h->data[i/2]data[i]=h->data[i/2]; } h->data[i]=x; }

주의: (1).i=++h->size는 먼저 덧셈 (++i) 이고 i++는 먼저 덧셈
(2).for 순환 퇴출 조건은 h->data[0]>x입니다. 보초병은 매우 큰 수이기 때문입니다.
(3).만약 i/2의 수가 i보다 작다면 작은 것을 아래에 놓고 큰 것은 먼저 놓지 않아도 된다(h->data[i]=2). 마지막으로 확정된 것은 순환이 튀어나올 때(h->data[i]=x)
가장 많은 삭제:
int Delete(Maxheap h){
	int parent,child;
	if(h->size==0){
		printf(" , !");
		return ;
	}
	int temp=h->data[h->size--];
	int max=h->data[1];
	for(parent=1;parent*2<=h->size;parent=child){
		child=parent*2;
		if((child!=h->size)&&(h->data[child]data[child+1])){
			child++;
		}
		if(temp>=h->data[child]){
			break;
		}else{
			h->data[parent]=h->data[child];
		}
	}
	h->data[parent]=temp;
	return max;
}

주의: (1).삭제는 먼저 맨 윗부분의 원소를 옮긴 다음에 마지막 원소를 올려놓는 것을 가정한 다음에 (이렇게 하면 완전히 두 갈래 나무의 구조를 보존한다) 모든 원소의 위치를 조정한다.
(2).parent는 마지막 원소의 일시적인 위치입니다. 먼저 순환하는 조건은 아들이 있어야만 이동할 수 있습니다(parent*2<=h->size). 그리고 그 아들 중 가장 큰 하나를 가져옵니다(오른쪽 아들이 있는 전제는child!=h->size). 그리고 temp는 아들들보다 큽니다. parent가temp의 위치가 정확하다는 것을 증명합니다. 아들들보다 작으면 아들을 올려놓고 자신이 잠시 놓을 수 없습니다. 위치가 확실하지 않기 때문입니다.그리고parent=child는temp의 일시적인 위치를 수정하고 마지막에 순환해서 튀어나오는 조건은 아들이 없다는 것을 나타낸다. 이때temp의 위치를 확정하는 것이 정확하다.
최대 크기 조정:
void PercDown(Maxheap h,int i){
	int x=h->data[i];
	int parent,child;
	for(parent=i;(parent*2)<=h->size;parent=child){
			child=parent*2;
			if((child!=h->size)&&(h->data[child]data[child+1])){
				child++;
			}
			if(x>=h->data[child]){
				break;
			}else{
				h->data[parent]=h->data[child];
			}
	}
	h->data[parent]=x;

}
void BuildHeap(Maxheap h){
	int i;
	for(i=h->size/2;i>0;i--){
		PercDown(h,i);
	}
}

주의: (1).어떻게 흩어진 완전한 두 갈래 나무를 최대 무더기로 조정합니까?먼저 마지막 원소의 부모 노드부터 조정하고 i--로 조정하며 첫 번째 원소도 조정해야 한다(그래서 i>0)
(2).어떻게 조정하지?먼저 x는 부원소(즉 색인이 i인 원소)이다. 만약에 부원소가 아들들보다 크면 조정할 필요가 없다. 만약에 아들들이 크면 큰 아들을 올려놓고 자신이 잠시 내려놓을 수 없다(위치가 확실하지 않기 때문에 계속 비교해야 한다).parent는 부원소가 아들들보다 크거나 부원소가 아들이 없을 때까지 위치를 표시한다. 이때 위치도 확정된다.이 위치에 요소를 삽입합니다.

좋은 웹페이지 즐겨찾기