第10章排序(上课用)试卷.ppt

25 25* 08 21 16 49 1 2 3 4 5 6 16 25* 08 25 21 49 1 3 6 5 4 2 25 25* 21 08 16 49 16 25* 21 08 25 49 交换 1 号与 5 号对象, 5 号对象就位 从 1 号到 5号 重新 调整为最大堆 堆调整 25* 16 08 21 25 49 1 2 3 4 5 6 08 16 25* 25 21 49 1 3 6 5 4 2 25* 16 21 08 25 49 08 16 21 25* 25 49 交换 1 号与 4 号对象, 4 号对象就位 从 1 号到 4 号 重新 调整为最大堆 堆调整 21 16 25* 08 25 49 1 2 3 4 5 6 08 16 25* 25 21 49 1 3 6 5 4 2 21 16 08 25* 25 49 08 16 21 25* 25 49 交换 1 号与 3 号对象, 3 号对象就位 从 1 号到 3 号 重新 调整为最大堆 堆调整 16 08 25* 21 25 49 1 2 3 4 5 6 08 16 25* 25 21 49 1 3 6 5 4 2 16 08 21 25* 25 49 08 16 21 25* 25 49 交换 1 号与 2 号对象, 2 号对象就位 从 1 号到 2 号 重新 调整为最大堆 堆调整 21 25 25* 49 16 08 1 2 3 4 5 6 i 21 25 25* 16 49 08 1 3 6 5 4 2 i 21 25 49 25* 16 08 初始关键字集合 21 25 49 25* 16 08 i = 3 时的局部调整 建立初始的最大堆 21 25 25* 49 16 08 1 2 3 4 5 6 i 49 25 25* 16 21 08 1 3 6 5 4 2 21 25 49 25* 16 08 49 25 21 25* 16 08 i = 1 时的局部调整 形成大顶堆 i = 2 时的局部调整 建立初始的最大堆 最大堆的第一个对象r[1]具有最大的关键字,将r[1]与r[n]对调,把具有最大关键字的对象交换到最后,再对前面的n-1个对象,使用堆的调整算法HeapAdjust(1, n-1),重新建立最大堆。结果具有次最大关键字的对象又上浮到堆顶,即r[1]位置。 再对调r[1]和r[n-1],调用HeapAdjust (1, n-2),对前n-2个对象重新调整。 如此反复执行,最后得到全部排序好的对象序列。这个算法即堆排序算法。 typedef SqList HeapType; //顺序存储方式 基于初始堆进行堆排序 void HeapAdjust(HeapType H, int s, int m) { //调整H.r[s]的关键字,使H.r[s…m]成为一个大顶堆 ElemType rc=H.r[s]; for (int j=2*s; j=m; j*=2) //沿较大的孩子结点向下筛选 { if ((jm) (LT(H.r[j].key,H.r[j+1].key))) ++j; //j为key较大的结点下标 if (!(LT(rc.key,H.r[j].key))) break; //找到rc待插位置s H.r[s]=H.r[j]; s=j; /*改变后的局部子堆顶的值,s随着 j的向下移动而向下移动*/ } H.r[s]=rc; //插入 } 最大堆的向下调整算法 void HeapSort ( HeapType H ) { int i; RedType temp; for (i=H.length/2; i0; --i) // 把H.r[1..H.length]建成大顶堆 HeapAdjust ( H, i, H.length ); for (i=H.length; i1; --i) { temp=H.r[i]; H.r[i]=H.r[1]; H.r[1]=temp; /* 将堆顶记录和当前未经排序子序列Hr[1..i]中 最后一个记录相互交换 */ HeapAdjust (H, 1, i

文档评论(0)

1亿VIP精品文档

相关文档