编程语言
首页 > 编程语言> > 堆排序--c++实现

堆排序--c++实现

作者:互联网

大顶堆与小顶堆的概念

大顶堆:每个节点的值都大于或等于其他左右孩子节点的值。

小顶堆:每个节点的值都小于或等于其他左右孩子节点的值。

堆排序过程:

  1. 先将n个元素的无序序列,构建成大顶堆。
  2. 将根节点与最后一个元素交换位置
  3. 交换之后可能不再满足大顶堆的条件,所以需要将剩下的n-1个元素重新构建成大顶堆
    • 交换过程:
      • )先找到最后一个非叶子节点,最后一个非叶子节点为:(长度/2-1),然后比较该节点值与他的子数值,如果该节点小于其他左右子树的值就交换。
      • )继续找到下一个非叶子节点,当前坐标-1的位置,在进行比较该节点的值与其左右子树节点的值是否符合大顶堆,不符合则交换。
  4. 重复第二步,第三步直到整个数组排序完成。

堆排序的规律

升序---使用大顶堆

降序---使用小顶堆

代码实现:

#pragma once
#include <vector>
using namespace std;
void buildBigHeap(vector<int>&arr,int len,int index)
{
	int left = 2 * index + 1;
	int right = 2 * index + 2;

	int maxIndex = index;
	if (left<len && arr[left]>arr[maxIndex]) maxIndex = left;
	if (right<len && arr[right]>arr[maxIndex])maxIndex = right;

	if (maxIndex != index)
	{
		swap(arr[maxIndex], arr[index]);
		buildBigHeap(arr, len, maxIndex);
	}
}
void heapSort(vector<int>& arr)
{
	int size = arr.size();
	//建立大根堆
	for (int i = size / 2 - 1; i >= 1; i--)
	{
		buildBigHeap(arr, size, i);
	}
	//每次将根节点放到最后面,调整大根堆
	for (int i = size - 1; i >= 1; i--)
	{
		swap(arr[0], arr[i]);
		buildBigHeap(arr, i, 0);
	}

}

举例测试:

int main()
{
        vector<int>arr = { 6,5,7,9,3,4,0 };
		cout << "排序前 ";
		for (int i = 0; i < arr.size(); i++)
		{
			cout <<arr[i] << " ";
		}
		cout << endl;
		heapSort(arr);
		cout << "排序前 ";
		for (int i = 0; i < arr.size(); i++)
		{
			cout <<arr[i] << " ";
		}
        return 0;
}

测试结果:

标签:index,arr,--,堆排序,c++,int,maxIndex,节点,size
来源: https://blog.csdn.net/weixin_43632918/article/details/116564579