堆排序

对用二叉树来抽象很好理解,但是实际上操作对象是数组。

从小到大排序

1.构建大顶堆;

2.将末尾的元素与根元素交换;

3.将除了最大元素之后的剩余元素重新排成大顶堆;

4.重复步骤2和3共n - 1次,.最终的序列是有序的。

#include

using namespace std;

void adjust(vector&arr, int i ,int n){
    int j = i * 2, tmp = arr[i - 1];
    while(j <= n){
        if(j < n && arr[j - 1] < arr[j]) j++;
        if(tmp >= arr[j - 1]) break;
        arr[j / 2 - 1] = arr[j - 1];
        j *= 2;
    }
    arr[j / 2 - 1] = tmp;
}

void heapSort(vector& arr){
    for(int i = arr.size() / 2; i >= 1; --i){
        adjust(arr, i, arr.size());
    }
    for(int i = arr.size() - 1; i >= 0; --i){
        swap(arr[0], arr[i]);
        adjust(arr, 1, i);
    }
}

void print(vector&arr){
    for(auto i : arr){
        cout< arr = {5,3,7,3,5,8,9,31,1};
    heapSort(arr);
    print(arr);
    return 0;
}

输出:

1 3 3 5 5 7 8 9 31

你可能感兴趣的:(堆排序)