堆排序(C++实现,非常简洁明了)

#include
#include

using namespace std;
//i代表当前节点,n代表总的数量,这里是在不断的交换
//这里最终建立的是小根堆,最小值往上冒
void change_smallest(vector &nums,int len,int i)
{
	int smallest = i;
	int left = 2 * i + 1;//注意这里的序号是从0开始的
	int right = 2 * i + 2;
	if (left &nums)
{
	int len = nums.size();
	for (int i = len / 2 - 1; i >= 0; i--)
	{
		change_smallest(nums,len, i);
	}
	for (int i = len - 1; i >= 0; i--)
	{
		swap(nums[i], nums[0]);//这一步是完成根顶元素和最末端的元素的交换,交换完之后,继续进行堆排序,使数组最后面的值都是当前最小值
		change_smallest(nums, i,0);//这里其实是把最小值和最后一位进行交换,并且不考虑交换后的元素,此时整体数组长度减一
	}
}

void printarray(vector arr, int n)
{
	for (int i = n - 1; i >= 0; i--)
		cout << arr[i] << " ";//倒序输出,因为此时的数组是递减的
	cout << endl;
}

//按照小根堆排序
//按照最小排序
int main()
{
	vector arr = { 3,5,4,7,6,9,8};
	int n = arr.size();
	cout << "origin array:";
	printarray(arr, n);
	heap_sort(arr);
	cout << "sorted array:";
	printarray(arr, n);
	system("pause");
	return 0;
}

你可能感兴趣的:(LeetCode)