码迷,mamicode.com
首页 > 其他好文 > 详细

Heap sort

时间:2015-04-17 11:37:45      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。

堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

维护堆的性质

MAX-HEAPIFY(A,i)维护堆A第i个元素,使其满足A[PARENT[i]] >= A[i]
如下图所示
技术分享
堆A的第二个元素4违反了大根堆的性质,现在将它与它的子节点(第四个元素)替换,仍旧违反大根堆的性质,继续替换,直到此节点满足A[PARENT[i]] >= A[i]。如图所示,我们可知,递归调用MAX-HEAPIFY(A,i),就可以调整堆,使得值为A[i]的元素不会违反大根堆的性质。
代码如下:
void max_heapify(vector<int>&A,int i)
{
	int l=2*i+1,r=2*i+2,largest=0,temp;//l为第i个元素的左孩子,r为第i个元素的右孩子。
	if(l<=A.size()-1&&A[l]>A[i])
		largest=l;
	else
		largest=i;
	if(r<=A.size()-1&&A[r]>A[largest])
		largest=r;
	if(largest!=i)
	{
		temp=A[i];
		A[i]=A[largest];
		A[largest]=temp;
		max_heapify(A,largest);
	}		
}

建堆

采用自底向上的方法利用过程MAX-HEAPIFY(A,i)把数组A转换为最大堆,因为用数组表示存储n个元素的堆时,叶节点的下标分别为n/2+1,...,n.(n/2指的是向下取整,即(int)5/2=2)则每个叶节点均可看成只包含一个节点的堆,不用对叶节点进行MAX-HEAPIFY,其他节点均调用一次MAX-HEAPIFY,便可求得大根堆。
代码如下:
void build_max_heap(vector<int>&A)
{
	for(int i=A.size()/2-1;i>=0;i--)
	{
		max_heapify(A,i);
	}
}

堆排序

堆排序的主要技术就是建大根堆,大根堆建成之后,堆顶就是最大元素,将第一个元素和最后一个元素互换,读取最后一个元素,并删除,这时候第一个元素可能会违反大根堆的性质,根据MAX-HEAPIFY调整堆,又可得到一个最大堆,再执行之前相似的操作,便可依次输出有序元素。代码如下:
void heap_sort(vector<int>&A)
{
	vector<int>B;
	B=A;
	int temp;
	build_max_heap(B);
	for(int i=B.size()-1;i>=1;i--)
	{
		temp=B[0];
		B[0]=B[i];
		B[i]=temp;
		temp=B.back();
		B.pop_back();
		A[i]=temp;
		max_heapify(B,0);
	}
	A[0]=B[0];
}

完整代码如下:
#include<iostream>
#include<vector>
 #include <stdlib.h>
#include <time.h> 
using namespace std;
void max_heapify(vector<int>&A,int i);
void build_max_heap(vector<int>&A);
void heap_sort(vector<int>&A);
main.cpp
void build_max_heap(vector<int>&A)
{
	for(int i=A.size()/2-1;i>=0;i--)
	{
		max_heapify(A,i);
	}
}

void heap_sort(vector<int>&A)
{
	vector<int>B;
	B=A;
	int temp;
	build_max_heap(B);
	for(int i=B.size()-1;i>=1;i--)
	{
		temp=B[0];
		B[0]=B[i];
		B[i]=temp;
		temp=B.back();
		B.pop_back();
		A[i]=temp;
		max_heapify(B,0);
	}
	A[0]=B[0];
}

void max_heapify(vector<int>&A,int i)
{
	int l=2*i+1,r=2*i+2,largest=0,temp;
	if(l<=A.size()-1&&A[l]>A[i])
		largest=l;
	else
		largest=i;
	if(r<=A.size()-1&&A[r]>A[largest])
		largest=r;
	if(largest!=i)
	{
		temp=A[i];
		A[i]=A[largest];
		A[largest]=temp;
		max_heapify(A,largest);
	}		
}

void main()
{
	srand(time(NULL));
	vector<int> str(11,0);
	cout<<"str:"<<endl;
	for(int i=0;i<str.size();i++)
	{
		str[i]=rand()%20;
		cout<<str[i]<<"  ";
	}
	cout<<endl;
	heap_sort(str);
	cout<<"After heap sort:"<<endl;
	for(int i=0;i<str.size();i++)
	{
		cout<<str[i]<<"  ";
	}
	cout<<endl;
}
程序执行结果如下:
技术分享





Heap sort

标签:

原文地址:http://blog.csdn.net/sinat_24520925/article/details/45082743

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