跳转至

排序——堆排序

#include <iostream>
#include <vector>
using namespace std;

// 堆排序的内部方法
// i是堆中一项的下标
// 返回左儿子的下标
inline int leftChild(int i)
{
    return 2 * i + 1;
}

// 在deleteMax和bulidHeap中用到的堆排序的内部方法
// i是开始向下过滤的位置
// n是二叉堆的逻辑大小
template<class T>
void percolateDown(vector<T> &a, int i, int n)
{
    int child;
    T tmp;

    for(tmp = move(a[i]); leftChild(i) < n; i = child){
        child = leftChild(i);
        if(child != n - 1 && a[child] < a[child + 1])
            ++child;
        if(tmp < a[child])
            a[i] = move(a[child]);
        else
            break;
    }
    a[i] = move(tmp);
}

template<class T>
void heapSort(vector<T> &a)
{
    for(int i = a.size() / 2 - 1; i >= 0; --i){
        percolateDown(a, i, a.size());
    }

    for(int j = a.size() - 1; j > 0; --j){
        swap(a[0], a[j]);
        percolateDown(a, 0, j);
    }
}


int main()
{
    vector<int> a = {9,8,7,6,5,4,3,2,1};

    heapSort(a);

    for(int i = 0; i < a.size(); ++i)
        cout << a[i] << '\t' ;

    return 0;
}
//using STL
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

void heapSort(vector<int> &v)
{
    priority_queue<int> pq;

    for (size_t i = 0; i < v.size(); ++i){
        pq.push(v[i]);
    }

    for (int i = v.size() - 1; i >= 0; --i){
        v[i] = pq.top();
        pq.pop();
    }
}

void writeVector(vector<int> &v)
{
    for (size_t i = 0; i < v.size(); ++i)
        cout << v[i] << " ";

    cout << endl;
}

int main()
{
    vector<int> v = {16, 29,14,32,18,14,87,50,64,35};
    writeVector(v);

    heapSort(v);
    writeVector(v);

    return 0;
}
# run result
16 29 14 32 18 14 87 50 64 35 
14 14 16 18 29 32 35 50 64 87