这里是12.20随笔
题目留档:本题要求实现堆排序中的筛选函数,待排序列的长度1<=n<=1000。
函数接口定义:
void HeapAdjust( HeapType H, int s, int m);
其中L是待排序表,使排序后的数据从小到大排列。
类型定义:
typedef int KeyType;
typedef struct {
KeyType elem; /elem[0]一般作哨兵或缓冲区*/
int Length;
}SqList;
typedef SqList HeapType;
裁判测试程序样例:
include<stdio.h>
include<stdlib.h>
typedef int KeyType;
typedef struct {
KeyType elem; /elem[0]一般作哨兵或缓冲区/
int Length;
}SqList;
typedef SqList HeapType;
void CreatSqListHeapType L);/待排序列建立,由裁判实现,细节不表/
void HeapAdjust( HeapType H, int s, int m);
void HeapSort( HeapType H);
int main()
{
HeapType L;
int i;
CreatSqList(&L);
HeapSort(L);
for(i=1;i<=L.Length;i++)
{
printf("%d ",L.elem[i]);
}
return 0;
}
void HeapSort( HeapType H)
{ /堆顺序表H进行堆排序/
int i; KeyType rc;
/建立初始堆/
for( i=H.Length/2;i>0; i--)
{
HeapAdjust(H, i, H.Length);
}
for(i=H.Length;i>1;i--)
{
rc=H.elem[1];
H.elem[1]=H.elem[i];
H.elem[i]=rc;
HeapAdjust(H, 1, i-1);
}
}
/你的代码将被嵌在这里 /
代码留档:
void HeapAdjust(HeapType H,int s,int m){
KeyType rc=H.elem[s];
for(int i=2s;i<=m;i=i2){
if(i<m&&H.elem[i]<H.elem[i+1]){i++;}
if(rc>=H.elem[i]){break;}
H.elem[s]=H.elem[i];
s=i;
}
H.elem[s]=rc;
}