算法分析:堆排序

基本原理就是构建一个堆,然后删除根。

为了不用一个新的堆,把抽取出来的数据,放在堆末尾。

所以,要实现一个升序排序,就要构建一个最大堆,不停抽取最大数,放到末尾处。

	//----------------堆排序--------------------
	template<typename Comparable>
	void heapsort(Vector<Comparable>& a)
	{
		//构建堆,从二分一后的点都是在最底层的,所以往回执行下滤,一路向上,构建一个最大堆
		for (int i = a.size() / 2; i >= 0; i--)
		{
			percDown(a, i, a.size());
		}
		
		for (int j = a.size() - 1; j > 0; j--)
		{
			//交换头尾,得出最大的值在队尾,堆减少,
			Comparable temp = a[0];
			a[0] = a[j];
			a[j] = temp;
			//破坏了堆结构,执行下滤
			percDown(a, 0, j);
		}
	}
	int leftChild(int i)
	{
		return 2 * i + 1;
	}
	template<typename Comparable>
	void percDown(Vector<Comparable>& a, int i, int n)
	{
		int child;
		Comparable tmp = a[i];//当前需要下滤的实体
		for ( ; leftChild(i) < n; i = child)
		{
			child = leftChild(i);//左边的儿子
			if (child != n -1 && a[child] < a[child + 1])
			{
				child++;//左边的儿子比右边的儿子小,这是找大的一个
			}
			if (tmp < a[child])//比儿子小
			{
				a[i] = a[child];
			}
			else
			{
				break;
			}
		}
		a[i] = tmp;
	}


posted @ 2017-01-11 14:38  肥宝游戏  阅读(200)  评论(0编辑  收藏  举报