堆排序的算法思想:将待排序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶元素。输出堆顶元素,将堆顶元素与堆底最后一个元素进行交换,然后,将剩余n-1个元素重新构造成大顶堆,如此反复直至排序结束。
PS:基于大顶堆的堆排序得到的是递增序列,基于小顶堆的堆排序得到的是递减序列。
手工模拟
代码
#include<iostream>
#include<vector>
using namespace std;
class HeapSort {
public:
//交换
static void swap(vector<int> &arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//调整堆(大顶堆)
static void heapAdjust(vector<int> &arr, int i, int len)
{
int left = 2 * i + 1, right = 2 * i + 2;
int maxIndex = i;
if (left < len && arr[left] > arr[maxIndex])
{
maxIndex = left;
}
if (right < len && arr[right] > arr[maxIndex])
{
maxIndex = right;
}
if (maxIndex != i)
{
swap(arr, maxIndex, i);
heapAdjust(arr, maxIndex, len);
}
}
//建大顶堆
static void buildMaxHeap(vector<int> &arr, int len)
{
for (int i = (len - 1) / 2; i >= 0; i--)
{
heapAdjust(arr, i, len);
}
}
//堆排序
static void heapSort(vector<int> &arr, int len)
{
buildMaxHeap(arr, len);
for (int i = len - 1; i > 0; i--)
{
//输出堆顶元素,把堆顶最大值放在堆末,堆顶变成一个较小值
swap(arr, 0, i);
len--; //堆长度减1
heapAdjust(arr, 0, len); //调整堆,从新的堆顶元素开始调整
}
}
};
int main()
{
vector<int> arr = { 5,7,3,1,10,9,123,4,53,65 };
cout << "待排序列:" << endl;
for (int i = 0; i < 10; i++)
{
cout << arr[i] << " ";
}
cout << endl;
HeapSort::heapSort(arr,10);
cout << "堆排序后的序列:" << endl;
for (int i = 0; i < 10; i++)
{
cout << arr[i] << " ";
}
return 0;
}
程序结果:
觉得有帮助的点个赞哟,万分感谢❤