知识大全 排序 - 选择排序 - 堆排序(二)

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

相关参考