本来计划在2.12之前把Hash Label的问题结束,无奈前几天贪玩,今天才把堆排序的代码写出来.
#include
<
stdio.h
>
#include < math.h >
static int Heapsize = 10 ;
int Right( int i)
... {
return 2*i+1;
}
int Left( int i)
... { return 2*i;
}
int Parent( int i)
... { return floor(i/2);
}
void MaxHeapify( int A[], int i)
... { int l,r,largest,var;
l=Left(i);
r=Right(i);
if ((l<=Heapsize)&&(A[l]>A[i]))
largest=l;
else largest=i;
if ((r<=Heapsize)&&(A[r]>A[largest]))
largest=r;
if (largest!=i)
...{var=A[i];
A[i]=A[largest];
A[largest]=var;
MaxHeapify(A,largest);
}
}
void BuildMaxHeap( int A[])
... {
int j=floor(Heapsize/2);
for(;j>=1;j--)
MaxHeapify(A,j);
}
void HeapSort( int A[])
... { int i,var;
for(i=10;i>=2;i--)
...{ var=A[1];
A[1]=A[i];
A[i]=var;
Heapsize--;
MaxHeapify(A,1);
}
}
void main()
... { int A[11]=...{0,16,14,10,8,7,9,3,2,4,1};
int i=1;
HeapSort(A);
for(;i<=10;i++)
printf("No.%d=%d ",i,A[i]);
getch();
}
#include < math.h >
static int Heapsize = 10 ;
int Right( int i)
... {
return 2*i+1;
}
int Left( int i)
... { return 2*i;
}
int Parent( int i)
... { return floor(i/2);
}
void MaxHeapify( int A[], int i)
... { int l,r,largest,var;
l=Left(i);
r=Right(i);
if ((l<=Heapsize)&&(A[l]>A[i]))
largest=l;
else largest=i;
if ((r<=Heapsize)&&(A[r]>A[largest]))
largest=r;
if (largest!=i)
...{var=A[i];
A[i]=A[largest];
A[largest]=var;
MaxHeapify(A,largest);
}
}
void BuildMaxHeap( int A[])
... {
int j=floor(Heapsize/2);
for(;j>=1;j--)
MaxHeapify(A,j);
}
void HeapSort( int A[])
... { int i,var;
for(i=10;i>=2;i--)
...{ var=A[1];
A[1]=A[i];
A[i]=var;
Heapsize--;
MaxHeapify(A,1);
}
}
void main()
... { int A[11]=...{0,16,14,10,8,7,9,3,2,4,1};
int i=1;
HeapSort(A);
for(;i<=10;i++)
printf("No.%d=%d ",i,A[i]);
getch();
}
其中的MaxHeapify BuildMaxHeap HeapSort 本来是自己按书中内容分别实现的,现在归结为一个文件,遍于阅读.
通过学习,现在对递归调用有了初步的感官认识,但在深入到理论分析,例如主定理的应用和证明,以及实践当中还有很长的路要走.
现在看到全书第二部分-排序和顺序统计学,终于结束了前段时间纯数理分析,虽然我对数学分析并不排斥,但终于能动手写代码,感觉很好.
这次的代码虽然实现了算法及正确性,但是在组织语言上仍有待提高,特别关于Heapsize和数组下标的分配仍然需要改进.