예제 #1
0
void heapsort(int array[],int length){
int i;
for(i=(length-1)/2;i>=0;--i)
heapadjust(array,i,length);
for(i=length-1;i>0;--i){
array[0]=array[0]+array[i]-(array[i]=array[0]);
heapadjust(array,0,i);
}
}
예제 #2
0
void heapadjust(int index, int sizeall, int depth)
{
	//printf("heapadjust %d %d %d\n",index,sizeall,depth);
	int nchild=index*2+1;
	//printf("nchild: %d\n",nchild);
	//scanf("%d",&nchild);
	if(nchild<sizeall)
	{
		if (nchild==sizeall-1)
		{
			printf
			(
				"%sif(%s>%s)\n"
				"%s{\n"
				,
				strtab[depth],getvar(nchild),getvar(index),
				strtab[depth]
			);
			itemxchg(nchild,index,depth+1);
			printf("%s}\n",strtab[depth]);
		}
		else
		{
			printf
			(
				"%sif(%s>%s&&%s>=%s)\n"
				"%s{\n"
				,
				strtab[depth],getvar(nchild),getvar(index),getvar(nchild),getvar(nchild+1),
				strtab[depth]
			);
			itemxchg(nchild,index,depth+1);
			heapadjust(nchild,sizeall,depth+1);
			printf("%s}\n",strtab[depth]);
			
			printf
			(
				"%sif(%s>%s&&%s>=%s)\n"
				"%s{\n"
				,
				strtab[depth],getvar(nchild+1),getvar(index),getvar(nchild+1),getvar(nchild),
				strtab[depth]
			);
			itemxchg(nchild+1,index,depth+1);
			heapadjust(nchild+1,sizeall,depth+1);
			printf("%s}\n",strtab[depth]);
		}
	}
}
예제 #3
0
파일: heap.c 프로젝트: linhaidong/algorithm
/*建立堆*/
int buildheap(int a[], int size)
{
    int i;
    //自底而上,从第一个非叶子节点开始
    //for(i = (size-1)/2; i >= 0; i--)
    for(i = size/2 - 1; i >= 0; i--)
    {
        heapadjust(a, i, size);
    }
}
예제 #4
0
파일: heap.c 프로젝트: linhaidong/algorithm
/* ----------------------------------------------------------------------------*/
void heapsort(int a[], int size)
{
    int i, j;
    
    //建立堆
    buildheap(a, size);
    printf("after heap:\r\n");
    print(a, size);
    
    //交换数据
    for(i = size-1; i > 0; i--)
    {
        swap(&a[i], &a[0]);
        printf("after swap:");
        print(a, size);
        heapadjust(a, 0, i);
        print(a, size);
    }
}
예제 #5
0
파일: heap.c 프로젝트: linhaidong/algorithm
/* ----------------------------------------------------------------------------*/
void heapadjust(int a[], int i, int size)
{
    int lchild = 2*i+1;
    int rchild = 2*i+2;
    int max = i;
    /*只调整非叶子节点*/
    //if(i <= (size-1)/2)
    //if(i <= (size/2-1))
    if(charg_leaf(i,size) )
    {
        if(lchild < size && a[lchild] > a[max])
            max = lchild;
        if(rchild < size && a[rchild] > a[max])
            max =  rchild;
        /*值不同,需要调整*/
        if(max != i)
        {
            swap(&a[max], &a[i]);
            /*从置换的节点开始调整,防止由于置换,破坏子堆的结构*/
            /*进入下一层,构造堆*/
            heapadjust(a, max, size);
        }
    }
}
예제 #6
0
int main(void)
{
	int n;
	int xhl;
	scanf("%d",&n);
	if(n<1||n>26)
	{
		printf("//Please enter 1~26\n");
		return 0;
	}
	varx=
	(
		(n<='t'-'a')?
		varxt:
		varxlong
	);
	printf(
		"#include <stdio.h>\n"
		"int main(void)\n"
		"{\n"
		"\tint "
	);
	for(xhl=0;xhl<n;xhl++)
		printf("%s,",getvar(xhl));
	printf("%s;\n",varx);
	printf("\tprintf(\"Please enter %d numbers:\\n\");\n",n);
	printf("\tscanf(\"");
	for(xhl=0;xhl<n;xhl++)
		printf("%%d");
	printf("\"");
	for(xhl=0;xhl<n;xhl++)
		printf(",&%s",getvar(xhl));
	printf(");\n");
	
	for(xhl=n/2-1;xhl>=0;xhl--)
		heapadjust(xhl,n,1);
	for(xhl=n-1;xhl>0;xhl--)
	{
		itemxchg(0,xhl,1);
		heapadjust(0,xhl,1);
	}
	
	printf("\tprintf(\"");
	for(xhl=0;xhl<n;xhl++)
	{
		printf("%%d");
		if(xhl==n-1)
			printf("\\n\"");
		else
			printf(" ");
	}
	for(xhl=0;xhl<n;xhl++)
	{
		printf(",%s",getvar(xhl));
	}
	printf(");\n");
	printf(
		"\treturn 0;\n"
		"}\n"
	);
}