// 调整指定结点
void adjust_heap(vector<int> &arr, int i, int size) //最大堆
{
int parrent = i, child = 2 * i + 1, val = arr[parrent];
// 寻找val的最终位置
while (child < size)
{
if (child + 1 < size && arr[child] < arr[child + 1])
child += 1;
if (arr[parrent] < arr[child])
{
swap(arr[parrent], arr[child]);
parrent = child;
child = 2 * parrent + 1;
}
else
break;
}
arr[parrent] = val;
}
// 调整数组,使其符合堆结构
void make_heap(vector<int> &arr)
{
for (int i = arr.size() / 2; i >= 0; i--)
adjust_heap(arr, i, arr.size());
}
// 堆排序
void sort_heap(vector<int> &arr)
{
for (int i = arr.size() - 1; i >= 0; i--)
{
swap(arr[i], arr[0]);
adjust_heap(arr, 0, i);
}
}
void print(vector<int> &arr)
{
for (int i = 0; i < arr.size(); i++)
cout << arr[i] << " ";
cout << endl;
}
int main()
{
vector<int> arr = { 1, 3, 4, 5, 2, 6, 9, 7, 8, 0 };
print(arr);
make_heap(arr);
print(arr);
sort_heap(arr);
print(arr);
}
堆排序
最新推荐文章于 2025-03-24 22:59:14 发布