/**
*
* Althor: Hacker Hao
* Create: 2023.12.10
*
*/
#include <bits/stdc++.h>
using namespace std;
#define MAXSIZE 200
const int N = 1e5 + 10;
int a[N];
void HeapAdjust(int* arr, int start, int end)
{
int tmp = arr[start];
for (int i = 2 * start + 1; i <= end; i = i * 2 + 1)
{
if (i < end && arr[i] < arr[i + 1])//有右子树 且 左子树小于右子树
{
i++;
} //i一定为是左右子树最大值
if (arr[i] > tmp)
{
arr[start] = arr[i];
start = i;
}
else
break;
}
arr[start] = tmp;
}
void HeapSort(int* arr, int n)
{
//第一次建立大根堆,从后往前依次调整
for (int i = (n - 1 - 1) / 2; i >= 0; i--)
{
HeapAdjust(arr, i, n - 1);
}
//每次将根和待排序的最后一次交换,然后在调整
int tmp;
for (int i = 0; i < n - 1; i++)
{
tmp = arr[0];
arr[0] = arr[n - 1 - i];
arr[n - 1 - i] = tmp;
HeapAdjust(arr, 0, n - 1 - i - 1);
}
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
HeapSort(a, n);
for (int i = 0; i < n; i++)
cout << a[i] << " ";
return 0;
}
C/C++:堆排序
最新推荐文章于 2024-07-22 09:38:37 发布