码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法——堆排序

时间:2017-08-06 00:20:24      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:int   算法   子节点   开始   log   堆排   父节点   amp   代码   

堆排序

  ①了解二叉堆的定义
  ②一般用数组表示堆 注意逻辑存储结构和实际存储结构
  ③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*/ } }

 

 

排序算法——堆排序

标签:int   算法   子节点   开始   log   堆排   父节点   amp   代码   

原文地址:http://www.cnblogs.com/myworld7/p/7291936.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!