首页 > 代码库 > 算法导论之 堆排序研究

算法导论之 堆排序研究

参考文献1:算法导论第六章讲解 堆排序
参考文献2:<a target=_blank href=http://www.mamicode.com/"http://blog.csdn.net/xiaoxiaoxuewen/article/details/7570621">http://blog.csdn.net/xiaoxiaoxuewen/article/details/7570621
/****************************************************************************/
/*time:2014.11.15  author:chen stallman             */
/*1.如何建立最大堆                                      */
/*2.把数组转换成最大堆                              */
/*3.把建好的堆中数据与原数组进行数据交换             */
/******************************************************************************/

#include<iostream>
#include<algorithm>

using namespace std;

void swap(int *x, int *y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}


//建立以root为i(即根节点为i)的最大堆,利用了递归的思想防止调整之后以largest为父节点的子树不是最大堆
void max_heapify(int a[], int i, int heapsize)
{
	int l = 2 * i;//取其左孩子的坐标
	int r = 2 * i + 1;//取其右孩子的坐标
	int largest;//临时变量,用来保存r、l、r三个节点中最大的值

	if (l<=heapsize&&a[l]>a[i])
		largest = l;
	else
		largest = i;

	if (r<=heapsize&&a[r]>a[largest])
		largest = r;

	if (largest != i)
	{
		swap(&a[i], &a[largest]);
		max_heapify(a, largest, heapsize);
	}
}

//***********************************************
//用自底向上的方法把数组转换成最大堆  
void buil_max_heap(int a[], int heapsize)
{
	int i;
	for (i = heapsize / 2; i >= 1; i--)
	{
		max_heapify(a, i, heapsize);
	}
}

//有了上面这个两个辅助功能函数就可以对数组进行堆排序了
void heap_sort(int a[], int len)
{
	int i;
	buil_max_heap(a, len);
	for (i = len; i >= 2; i--)
	{
		swap(&a[1], &a[len]);
		len--;
		max_heapify(a, 1, len);
	}
}

int main()
{
	//这里数组下标从1开始,数组第一个元素没有使用
	int a[] = { 0,12,-3,88,52,6,4,33,2,100,5,20};

	heap_sort(a, 11);

	for (auto i : a)
		cout << i << " ";

	cout << endl;

	return 0;
}

算法导论之 堆排序研究