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

堆排序

时间:2015-05-14 15:45:37      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

  堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

  这些概念性的东西读起来总是很绕口,其实我们在处理堆排序的时候只需要知道以下几点就好了。

  在用堆排序进行排序的时候我们先要构建堆,那么什么是堆呢?怎么构建呢?

  1. 堆排序是一个完全二叉树的结构。
  2. 父节点总是大于等于(或者小于等于)子节点。

  在排序的时候每次将最后一个节点与堆的根节点交换,然后重组堆。

  构建大顶堆的过程:

  1. 从最后一个非叶子节点开始往根出遍历。其实就是下标n/2到0的过程。
  2. 如果正在遍历的节点最大,则不用变换,如果存在左右孩子,孩子节点比自己大,则与最大的孩子节点进行交换。交换了之后,再以这个被交换的孩子节点为正在遍历的节点,寻找孩子,重复遍历操作。直到没有比自己大的孩子节点或者遍历超过数组长度。

  堆排序:

  1. 从堆顶开始,每次将最后的叶子节点与堆顶的节点进行交换。
  2. 交完完成之后以顶点节点为调整节点进行堆调整。
  3. 从0-->n-1的过程,便完成了整个排序。

 

  说明:堆排序的时间复杂度为O(nlog2n).跟快速排序一样,但是在实际排序中,快速排序总是比堆排序要快很多。

 

技术分享

堆排序算法的演示。首先,将元素进行重排,以符合堆的条件。图中排序过程之前简单的绘出了堆树的结构。

分类 排序算法
数据结构 数组
最差时间复杂度 技术分享
最优时间复杂度 技术分享[1]
平均时间复杂度 技术分享
最差空间复杂度 技术分享 total, 技术分享 auxiliary

 

C代码:

调整堆代码如下,如果用递归函数处理会容易理解很多,但是递归处理我认为在不需要的情况下最好不要,处理不好就是灾难性的,另外无限的分配栈,也会让资源吃紧。

 1 void adjust_heap( int src[] , int len , int adjusting )
 2 {
 3     for( int adj = adjusting ; adj < len ; ){
 4         int lchild = adj*2+1;
 5         int rchild = adj*2+2;
 6         if( lchild >= len ) break;   
 7 
 8         if( rchild >= len ) {
 9             if( src[lchild] < src[adjusting] ){
10                 int temp = src[lchild];
11                 src[lchild] = src[adjusting];
12                 src[adjusting] =  temp;
13                 adj = lchild;
14             }else break;
15         }else{
16             //adj = src[adj]<src[lchild] ? src[adj] < src[rchild] ? adj : rchild : src[lchild] < src[rchild] ? lchild : rchild;
17             int litter = src[lchild] < src[rchild] ? lchild : rchild;
18             litter = src[adj] < src[litter] ? adj : litter ;
19             if( litter == adj ){ 
20                 break;
21             }else{
22                 int temp = src[adj];
23                 src[adj] = src[litter];
24                 src[litter] = temp;
25                 adj = litter;
26             }
27         }
28     }
29 }

堆排序算法代码:

 1 void heap_sort( int src[] , int len)
 2 {
 3     for( int n = len/2 ; n >= 0 ; n-- ){
 4         adjust_heap(src,len,n);
 5     }
 6 
 7     for( int n = 0 ; n < len - 1 ; n++ ){
 8         int temp = src[0];
 9         src[0] = src[len -1 - n];
10         src[len - 1 - n] = temp ;
11         adjust_heap(src,len-n-1,0);
12     }
13 }

执行测试结果如下:

技术分享

 

堆排序

标签:

原文地址:http://www.cnblogs.com/jvane/p/4494641.html

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