C. 쌓 기 (hep) 를 실현 하 는 두 가지 방식
2825 단어 데이터 구조 와 알고리즘
#include
#include
#define mindata -10001
#define maxsize 1000
typedef int ElemType;
typedef struct { // ?
ElemType *Elems;
int size;
int capacity;
}HeapStruct,*MinHeap;
void MinHeapCreate (int Maxsize,MinHeap &H)
{
H->Elems =(ElemType *) malloc((maxsize+1)*sizeof(ElemType));
H->size=0;
H->capacity=maxsize;
H->Elems[0]=mindata;
}
void swap(MinHeap &H,int a,int b)
{
int temp;
temp = H->Elems[a];
H->Elems[a] = H->Elems[b];
H->Elems[b]=temp;
}
void shiftdown(MinHeap &H,int i)
{
int t,flag=0;//flag
while(i*2<=H->size&&flag==0)
{ // , t
if(H->Elems[i]>H->Elems[2*i]){
t=i*2;
}else{
t=i;
}
// ,
if(i*2 + 1 <= H->size)
{
// , t
if(H->Elems[t]>H->Elems[i*2+1])
t=i*2+1;
}
// ,
if(t!=i)
{
swap(H,t,i);
i=t;
}else{
flag=1;
}
}
}
void BulidMinHeap(MinHeap &H)
{
int i;
for(i=H->size/2;i>0;i--)
shiftdown(H,i);
}
int compare(MinHeap &H1,int child,int parent )
{
int flag=0;
if(H1->Elems[child]Elems[parent])
flag=1;
return flag;
}
void MinHeapinsert(MinHeap &H1,int N)
{
scanf("%d",&H1->Elems[1]);
H1->size++;
int i;
for(i=2;iElems[i]);
H1->size++;
int j=i;
while(j/2>0&&j!=1){
if(compare(H1,j,j/2)==1)
swap(H1,j,j/2);
j=j/2;
}
}
}
void print(MinHeap &H,int M,int *xb)
{
for(int i=0;i1)
{
printf("%d ",H->Elems[a]);
a=a/2;
}
printf("%d
",H->Elems[1]);
}
}
void gettop(MinHeap &H)
{
int top = H->Elems[1];
H->Elems[1]=H->Elems[H->size];
H->size--;
BulidMinHeap(H);
printf("%d
",top);
for(int i=1;i<=H->size;i++)
printf("%d ",H->Elems[i]);
}
main()
{
printf("
");
int N,M;
MinHeap H =(MinHeap) malloc (sizeof(HeapStruct));
MinHeapCreate (maxsize,H);
scanf("%d %d",&N,&M);
getchar();
for(int i=1;iElems[i]);
H->size++;
}
BulidMinHeap(H);
for(int i=1;i<=H->size;i++)
printf("%d ",H->Elems[i]);
putchar(10);
int xb[maxsize];
print(H,M,xb);
printf("
");
MinHeap H1 =(MinHeap) malloc (sizeof(HeapStruct));
MinHeapCreate (maxsize,H1);
scanf("%d %d",&N,&M);
MinHeapinsert(H1,N);
for(int i=1;i<=H1->size;i++)
printf("%d ",H1->Elems[i]);
putchar(10);
print(H1,M,xb);
// , ,
gettop(H);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[JAVA] 배열 회전 출력요소 가 출력 을 시작 하 는 위치 에 주의 하 십시오. 모두 몇 라운드 의 수출 이 있 습 니까? n/2 + 1 매 라 운 드 는 상, 우, 하, 좌 로 나 뉜 다. 각 방향의 시작 위치 와 좌표 의 관 계 를 구...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.