知识大全 排序 - 选择排序 - 堆排序(二)
Posted 知
篇首语:实践是知识的母亲,知识是生活的明灯。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 排序 - 选择排序 - 堆排序(二)相关的知识,希望对你有一定的参考价值。
堆排序
堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征 使得在当前无序区中选取最大(或最小)关键字的记录变得
简单
( )用大根堆排序的基本思想
① 先将初始文件R[ n]建成一个大根堆 此堆为初始的无序区
② 再将关键字最大的记录R[ ](即堆顶)和无序区的最后一个记录R[n]交换 由此得到新的无序区R[ n ]和有序区R[n] 且满足
R[ n ] keys≤R[n] key
③ 由于交换后新的根R[ ]可能违反堆性质 故应将当前无序区R[ n ]调整为堆 然后再次将R[ n ]中关键字最大的记录
R[ ]和该区间的最后一个记录R[n ]交换 由此得到新的无序区R[ n ]和有序区R[n n] 且仍满足关系R[ n
] keys≤R[n n] keys 同样要将R[ n ]调整为堆
……
直到无序区只有一个元素为止
( )大根堆排序算法的基本操作
① 初始化操作 将R[ n]构造为初始堆;
② 每一趟排序的基本操作 将当前无序区的堆顶记录R[ ]和该区间的最后一个记录交换 然后将新的无序区调整为堆(亦称重建堆
)
注意
①只需做n 趟排序 选出较大的n 个关键字即可以使得文件递增有序
②用小根堆排序与利用大根堆类似 只不过其排序结果是递减有序的 堆排序和直接选择排序相反 在任何时刻 堆排序中无序区总
是在有序区之前 且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止
( )堆排序的算法
void HeapSort(SeqIAst R)
//对R[ n]进行堆排序 不妨用R[ ]做暂存单元
int i;
BuildHeap(R); //将R[ n]建成初始堆
for(i=n;i> ;i ) //对当前无序区R[ i]进行堆排序 共做n 趟
R[ ]=R[ ];R[ ]=R[i];R[i]=R[ ]; //将堆顶和堆中最后一个记录交换
Heapify(R i ); //将R[ i ]重新调整为堆 仅有R[ ]可能违反堆性质
//endfor
cha138/Article/program/sjjg/201311/23780相关参考