排序算法——堆排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法——堆排序相关的知识,希望对你有一定的参考价值。

堆排序

  ①了解二叉堆的定义
  ②一般用数组表示堆 注意逻辑存储结构和实际存储结构
  ③i节点的
    父节点(i-1)/2 子节点 左2*i+1 右2*i+2
  ④注意每种操作的思想
  ⑤一般数组要堆化操作后再进行堆排序

代码实现
/*本栗子是最小堆*/
/*
从第i个节开始调整*/ void MinHeapDown(int a[],int i,int n) { int j=0,temp=0; temp = a[i]; j=2*i+1;/*i节点的左孩子*/ while(j < n) { if(j+1<n && a[j+1]<a[j])/*在左右孩子中找最小的来替换父节点i*/ j++; if(a[j] >= temp)/*父节点小于任何一个孩子*/ break; a[i] = a[j];/*将较小的节点往上移,替换父节点*/ i = j; j = 2*i+1; } a[i] = temp; } /*由于堆也是用数组模拟的,故堆化数组后,第一次将A[0]与A[n - 1]交换,再对A[0…n-2]重新恢复堆。 第二次将A[0]与A[n – 2]交换,再对A[0…n - 3]重新恢复堆,重复这样的操作直到A[0]与A[1]交换。 由于每次都是将最小的数据并入到后面的有序区间,故操作完成后整个数组就有序了*/ void HeapSort(int a[],int n) { int i=0; for(i=n/2-1;i>=0;i--)/*堆化数组(最小堆)*/ MinHeapDown(a,i,n); for(i=n-1;i>0;i--) { Swap(a[0],a[i]);/*将最小的数调到最后 循环一次后相当于删除了排在最后的最小值*/ MinHeapDown(a,0,i);/*从根节点0从上往下调整到i*/ } }

 

 

以上是关于排序算法——堆排序的主要内容,如果未能解决你的问题,请参考以下文章

选择排序(简单选择排序堆排序的算法思想及代码实现)

堆排序算法的实现

7.2堆排序的代码分析(算法基础—排序算法)

算法-java代码实现堆排序

十大经典排序算法总结(堆排序)

『算法设计_伪代码』堆排序