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

简单来说,就是利用二叉树,

1.建最大保持待排序区的最大数据永远是根节点,

2.将根节点与最后一个叶子节点互换位置.二叉树节点数减一.

3.因为新换上来的根节点不一定满足"最大"这个条件.所以要重新建堆.

4.重复步骤1-4.一直到二叉树大小为0.

struct Date
{
	int date[100];
	int size;
};

//建最大根堆
void max_heapify(Date *pDate,int a){
	
	int largest;
	int left = a*2;
	int right =left+1;
	if(left>pDate->size && right>pDate->size) return;
	if (left <= pDate->size) largest = pDate->date[a]>pDate->date[a*2]?a:left;
	if (right <= pDate->size) largest = pDate->date[largest]>pDate->date[a*2+1]?largest:right;
	if (largest != a){
		int temp;
		temp = pDate->date[a];
		pDate->date[a] = pDate->date[largest];
		pDate->date[largest] = temp;
		max_heapify(pDate,largest);
	}
	else 		return;
}

//建堆
void build_max_heap(Date *pDate)
{
	int size = pDate->size;
	int i = size/2;
	while (i)
	{
		max_heapify(pDate,i);
		size -= 2;
		i =size/2;
	}
}

//排序
void heapsort(Date *pDate)
{
	int temp;
	build_max_heap(pDate);
	for (int i = pDate->size; i > 0; i--)
	{
		temp = pDate->date[i];
		pDate->date[i] = pDate->date[1];
		pDate->date[1] = temp;
		pDate->size--;
		max_heapify(pDate,1);
	}
}


posted on 2015-04-13 15:31  zkkkkkky  阅读(131)  评论(0编辑  收藏  举报