堆排序算法原理与实现

来源:互联网 发布:淘宝自动购物 编辑:程序博客网 时间:2024/05/21 15:50

1. 堆

(1)形状:完全二叉树。

节点i : Parent = i/2 ; Left = 2i; Right = 2i + 1

(2)根最大(最小)——大根堆(小根堆),左右子树没有大小关系



2. 算法的思想

(1)由于跟最大(最小),所以每次输出根

(2)在对堆进行调整,

(3)重复(1)(2)知道结束

所以算法的重点就是如何建立堆和怎样高效的调整


3. 调整HeapAdjust

//大根堆//a[0] 不使用void HeapAdjust( int a[], int i, int size ){int l = 2*i;int r = l+1;int max = i;if( i < size/2 ) // leaf不需要调整{//从i, r, l中找到maxif( l<=size && a[l]>max )max = l;if( r<=size && a[r] > max )max = r;if( max != i ){swap( a[i], a[max] );HeapAdjust( a, max, size );}}}

4. 堆的建立

//a[0] 不使用void BuildHeap( int a[], int size ){for(int i = size/2; i>=1; i++ ){HeapAdjust( a, i, size );}}

5. 堆排序

void HeapSort( int a[], int size ){BuildHeap( a, size );for( int i=size; i>=1; i-- ){cout<<a[i]<<" ";swap( a[1], a[i] );HeapAdjust( a, 1, i-1 );}}

6. 算法分析

最好: nlog(n)

最坏:nlog(n)

平均:nlog(n)

空间复杂度:1

稳定性:非

由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。

堆在获取数据的最大值or最小值比较有优势

===============================================================================

分类
基础排序O(n^2)
高级排序O(nlogn)
交换冒泡排序快排插入插入排序希尔选择选择排序堆排序

原创粉丝点击