堆排Heap Sort

#define LeftChild(i) (2*(i)+1)
void PercDown(vector<int>&num, int i, int n)
{
	int child;
	int tmp;
	for (tmp = num[i]; LeftChild(i) < n; i = child)
	{
		child = LeftChild(i);
		//如果右儿子存在,且值大于左儿子,则取右儿子
		if (child != n - 1 && num[child + 1] > num[child])
			child++;
		//如果父亲的值小于儿子,则继续下沉
		if (tmp < num[child])
			num[i] = num[child];
		else//否则,退出循环
			break;
	}
	num[i] = tmp;
}
//先建立堆
for (int i = n / 2; i >= 0; i--)
        PercDown(numCopy, i, n);
for (int i = n - 1; i>0; i--)
{//进行堆排
	swap(numCopy[0], numCopy[i]);
	PercDown(numCopy, 0, i);
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注