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

#include<iostream>
#include<vector>

using namespace std;
//i代表当前节点,n代表总的数量,这里是在不断的交换
//这里最终建立的是小根堆,最小值往上冒
void change_smallest(vector<int> &nums,int len,int i)
{
	int smallest = i;
	int left = 2 * i + 1;//注意这里的序号是从0开始的
	int right = 2 * i + 2;
	if (left<len&&nums[left] < nums[smallest])
		smallest = left;
	if (right<len&&nums[right] < nums[smallest])
		smallest = right;
	if (smallest != i)
	{
		swap(nums[smallest], nums[i]);
		i = smallest;
		change_smallest(nums, len,i);//采用递归的形式依次进行排序
	}
}

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

//按照小根堆排序
//按照最小排序
int main()
{
	vector<int> 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;
}
发布了263 篇原创文章 · 获赞 292 · 访问量 41万+

猜你喜欢

转载自blog.csdn.net/qq_29462849/article/details/98245245
今日推荐