把一个结点放在合适的值上
void Sift(RecType R[],int k,int n)
{//k表示被筛选的结点的关键字,n表示待排序的记录个数
int i, j;
i=k;
j=2*i; //计算R[i]的左孩子位置
R[0]=R[i]; //将R[i]保存在临时单元中
while(j<=n)
{ if((j<n)&&(R[j].key>R[j+1].key))
++j; //选择左右孩子中最小者
if(R[0].key>R[j].key) //当前结点大于左右孩子的最小者
{ R[i]=R[j];
i=j; j=2*i; }
else //当前结点不大于左右孩子
break;
}
R[i]=R[0]; //被筛选结点放到最终合适的位置上
void Sift(RecType R[],int k,int n)
{//k表示被筛选的结点的关键字,n表示待排序的记录个数
int i, j;
i=k;
j=2*i; //计算R[i]的左孩子位置
R[0]=R[i]; //将R[i]保存在临时单元中
while(j<=n)
{ if((j<n)&&(R[j].key>R[j+1].key))
++j; //选择左右孩子中最小者
if(R[0].key>R[j].key) //当前结点大于左右孩子的最小者
{ R[i]=R[j];
i=j; j=2*i; }
else //当前结点不大于左右孩子
break;
}
R[i]=R[0]; //被筛选结点放到最终合适的位置上
}
堆排序的算法描述如下:
void Heap_Sort(RecType R[],int n)
{ int j;
for(j=n/2;j>0;--j) //建初始堆
Sift(R,j,n);
for(j=n;j>1;--j) { //进行n-1趟排序
R[0]=R[1]; //将堆顶元素与堆中最后一个元素交换
R[1]=R[j]; R[j]=R[0];
Sift(R,l,j-1); //将R[1]..R[j-1]调整为堆
}
}
8454

被折叠的 条评论
为什么被折叠?



