c 언어는 가장 많은 기본 기능을 실현한다
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는 부원소가 아들들보다 크거나 부원소가 아들이 없을 때까지 위치를 표시한다. 이때 위치도 확정된다.이 위치에 요소를 삽입합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.