堆排序--c++实现
作者:互联网
大顶堆与小顶堆的概念
大顶堆:每个节点的值都大于或等于其他左右孩子节点的值。
小顶堆:每个节点的值都小于或等于其他左右孩子节点的值。
堆排序过程:
- 先将n个元素的无序序列,构建成大顶堆。
- 将根节点与最后一个元素交换位置
- 交换之后可能不再满足大顶堆的条件,所以需要将剩下的n-1个元素重新构建成大顶堆
- 交换过程:
- )先找到最后一个非叶子节点,最后一个非叶子节点为:(长度/2-1),然后比较该节点值与他的子数值,如果该节点小于其他左右子树的值就交换。
- )继续找到下一个非叶子节点,当前坐标-1的位置,在进行比较该节点的值与其左右子树节点的值是否符合大顶堆,不符合则交换。
- 交换过程:
- 重复第二步,第三步直到整个数组排序完成。
堆排序的规律
升序---使用大顶堆
降序---使用小顶堆
代码实现:
#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