堆排序问题

堆排序问题_第1张图片代码如下:

//1.先将数组里的数字调整为大根堆(父节点均大于两个子节点)--由第一个非叶子节点开始
//第一个叶子节点是len/2,所以非叶子节点位len/2-1
//2.将根节点和最后一个结点进行交换,再将剩下的节点调整为大根堆,依此类推,直到将数组中的数字从小到大排好序

void HeapAdjust(int* nums, int start, int end)//调整为大根堆
{
	int temp = nums[start];//第一个非叶子节点作为start
	for (int i = 2 * start + 1; i <= end; i = i * 2 + 1)//由它的左节点开始
	{
		if (i < end && nums[i] < nums[i + 1])//如果它的左节点<右节点,则此时右节点的下标为i
		{
			i++;
		}
		if (nums[i] > temp)//左右节点中最大的数>父节点,就将两个交换
		{
			nums[start] = nums[i];//将子节点给父节点
			start = i;
		}
		else
		{
			break;
		}
	}
	nums[start] = temp;//将原来的父节点给子节点

}

void HeapSort(int* nums, int len)//将调整好的大根堆按由小到大的顺序进行排序
{
    //第一次建立大根堆,从后往前依次调整
	for (int i = (len - 1 - 1) / 2; i >= 0; i--)//从第一个非叶子节点开始
	{
		HeapAdjust(nums , i, len - 1);
	}
	int temp;
	for (int i = 0; i < len - 1; i++)//调整好大根堆之后根节点是最大的
	{
		temp = nums[0];//将根节点和最后一个节点的值进行交换
		nums[0] = nums[len - 1 - i];
		nums[len - 1 - i] = temp;
		HeapAdjust(nums, 0, len - 1 - i - 1);//将剩下的节点再次调整为大根堆
	}
}


int main()
{
	int n, nums[200];
	cout << "输入元素的个数" << endl;
	cin >> n;
	cout << "依次输入数字" << endl;
	for (int i = 0; i < n; i++)
	{
		cin >> nums[i];
	}
	HeapSort(nums, n);
	cout << "堆排序后的结果" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << nums[i] << " ";
	}
	cout << endl;

}

你可能感兴趣的:(算法,c++,数据结构)