时间复杂度:O(nlogn)
空间复杂度:O(1)
稳定性:不稳定
基本原理:以大顶堆-非降序排序为例:首先先利用数组构建大顶堆,然后将堆顶元素(最大值)和最后一个元素进行交换,在对1~n-1个元素进行调整使其依然为一个大顶堆,重复交换和调整操作直到堆中只剩下一个元素,则排序完成。
代码:
/*
大学课程中各种排序算法的实现
语言:C++
作者:Kylin.C
*/
#include<iostream>
#include<vector>
using namespace std;
//堆排序
void HeapAdjust(vector<int> &arr, int i, int length)
{
int maxChild;
for (; i < length / 2; i = maxChild)
{
maxChild = 2 * i + 1;//先令maxChild等于节点i的左子节点下标
if (maxChild < length - 1 && arr[maxChild + 1]>arr[maxChild])
++maxChild;//如果右子节点存在且大于左子节点则令maxChild等于右子节点下标
if (arr[i] < arr[maxChild])
swap(arr[i], arr[maxChild]);
else
break;
}
}
void HeapSort(vector<int> &arr)
{
if (arr.size() == 0)
return;
for (int i = arr.size() / 2 - 1; i >= 0; --i)
HeapAdjust(arr, i, arr.size());
for (int i = arr.size() - 1; i > 0;--i)
{
swap(arr[0], arr[i]);
/*交换数据的另一种写法
arr[i]=arr[0]^arr[i];
arr[0]=arr[0]^arr[i];
arr[i]=arr[0]^arr[i];
*/
HeapAdjust(arr, 0, i);
}
}
int main()
{
vector<int> arr{ 4, 2, 1, 4, 3, 8, 6, 5, 6 };
HeapSort(arr);
for (auto a : arr)
cout << a << " ";
cout << endl;
system("pause");
return 0;
}