堆排序

来源:互联网 发布:直播平台系统源码 编辑:程序博客网 时间:2024/05/29 03:50

时间复杂度: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;}
原创粉丝点击