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); } }
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]); } } }
/*建立堆*/ 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); } }
/* ----------------------------------------------------------------------------*/ 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); } }
/* ----------------------------------------------------------------------------*/ 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); } } }
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" ); }