📄 code.txt
字号:
typedef struct ISBN
{
char press[12];
char unknow[12];
char kind[12];
}HEAPSORT;
//ISBN码的结构描述
void CAsDlg::sift_press(HEAPSORT
*p[], int k, int i, int l)
{
int m,n;
char *t;
HEAPSORT *w;
t=(*p[i+k]).press;w=p[i+k];
n=2*(i+1)-1;m=i;
//令n指向左孩子
while(n<=l-1)
// 沿key较大的孩子结点向下筛选
{
if((n<l-1)&&(strcmp((*p[n+k]).press,
(*p[n+k+1]).press)<0))
//判断p[i]和p[2*i]大小,前者较大,不作调整.
//否则.交换p[i]和p[2*i]
n=n+1;
//令n指向右孩子
if(strcmp(t,(*p[n+k]).press)<0)
{
p[m+k]=p[n+k];
m=n;n=2*(m+1)-1;
} //始m,n指向下一层结点
else n=l;//循环退出
}
p[m+k]=w;
return;
}
//以编码中出版社为关键字筛选,初始建堆
void CAsDlg::sift_unknow(HEAPSORT *p[],
int k, int i, int l)
{
int m,n;
char *t;
HEAPSORT *w;
t=(*p[i+k]).unknow;w=p[i+k];
n=2*(i+1)-1;m=i;
//令n指向左孩子
while(n<=l-1)
// 沿key较大的孩子结点向下筛选
{
if((n<l-1)&&(strcmp((*p[n+k]).unknow,
(*p[n+k+1]).unknow)<0))
//判断p[i]和p[2*i]大小,前者较大,不作调整.
//否则.交换p[i]和p[2*i]
n=n+1;//令n指向右孩子
if(strcmp(t,(*p[n+k]).unknow)<0)
{
p[m+k]=p[n+k];
m=n;n=2*(m+1)-1;
} //始m,n指向下一层结点
else n=l;//循环退出
}
p[m+k]=w;
return;
}
//以编码中未知码为关键字筛选,初始建堆
void CAsDlg::sift_kind(HEAPSORT *p[],
int k, int i, int l)
{
int m,n;
char *t;
HEAPSORT *w;
t=(*p[i+k]).kind;w=p[i+k];n=2*(i+1)-1;m=i;
//令n指向左孩子
while(n<=l-1)
// 沿key较大的孩子结点向下筛选
{
if((n<l-1)&&(strcmp((*p[n+k]).kind,
(*p[n+k+1]).kind)<0))
//判断p[i]和p[2*i]大小,前者较大,不作调整.
//否则.交换p[i]和p[2*i]
n=n+1; //令n指向右孩子
if(strcmp(t,(*p[n+k]).kind)<0)
{
p[m+k]=p[n+k];
m=n;n=2*(m+1)-1;
} //始m,n指向下一层结点
else n=l; //循环退出
}
p[m+k]=w;
return;
}
//以编码中类别为关键字筛选.初始建堆
//初始建堆工作可通过反复筛选来完成,
//通过调用算法sift(),依次将以p[i],p[i-1],
//....p[1]为根的子树调整为堆
void CAsDlg::mtheap(HEAPSORT *p[],
int n, int k, int m,
void (*sift)(HEAPSORT *p[], int k,
int i, int l))
{
int i,l;
HEAPSORT *w;
if(k<0) k=0;
if(m>n-1) m=n-1;
l=m-k+1;
for(i=l/2-1;i>=0;i--)
(*sift)(p,k,i,l);
//从i开始,通过调用算法sift()
//依次将以p[i],p[i-1]
//,...p[1]为根的子树调整为堆
for(i=l-1;i>=1;i--)
{
w=p[k];p[k]=p[i+k];p[i+k]=w;
//将堆顶记录和当前为经排序
//子序列中最后一个记录相互交换
(*sift)(p,k,0,i);
//将p[]从新调整为大顶堆
} //实现堆排序
return;
} //堆排序
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -