堆排序算法 : (算法图解:参考链接)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void heapAdjust(vector<int>& arr, int i, int len)
{
int left, right, j;
while ((left = 2 * i + 1) <= len) //判断当前父节点有无左节点(即有无孩子节点,left为左节点)
{
right = left + 1; //右节点
j = left; //j指针指向左节点
if (right <= len && arr[left] < arr[right]) //右节点大于左节点
j++; //当前把"指针"指向右节点
//将父节点与孩子节点交换(如果上面if为真,则arr[j]为右节点,如果为假arr[j]则为左节点)
if (arr[i] < arr[j])
swap(arr[i], arr[j]);
else //说明比孩子节点都大,直接跳出循环语句
break;
i = j;
}
}
void heapSort(vector<int> & arr)
{
int len = arr.size() - 1;
for (int i = len / 2 - 1; i >= 0; i--)
heapAdjust(arr, i, len);
while (len >= 0)
{
swap(arr[0], arr[len--]); //将堆顶元素与尾节点交换后,长度减1,尾元素最大
heapAdjust(arr, 0, len); //再次对堆进行调整
}
}
int main()
{
vector<int> vec;
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
int a;
cin >> a;
vec.push_back(a);
}
heapSort(vec);
cout << "排序后:";
for (auto c : vec)
cout << c << " ";
return 0;
}
输出结果:
参考资料