排序-heapsort

#include <bits/stdc++.h>
using namespace std;

void adjust(vector<int> &nums, int i, int n){
    // i为待调整的节点,n为nums数组元素的个数,从上往下调整
    int j = 2 * i + 1; // 左子节点
    while(j < n){
        if(j+1 < n && nums[j+1] > nums[j]) j++;  // 比较左右孩子谁更大
        if(nums[j] < nums[i])   break;  // 都比父节点小就停止
        else{
            swap(nums[i], nums[j]);
            i = j;   // 继续往下调整
            j = 2 * i + 1;
        }
    }
}

void HeapSort(vector<int> &nums){
    int n =nums.size();
    for(int i=n/2-1; i>=0; i--){  // 从第一个非叶子节点开始(从下往上看第一个)
        adjust(nums, i, n);  
    }
    for(int i=n-1; i>=1; i--){
        swap(nums[0], nums[i]);   // 交换堆顶和最末一个元素
        adjust(nums, 0, i);  // 将最末一个元素去除,再进行调整
    }
}

int main()
{
    vector<int> a = {5,10,7,34,23,58,2,55,35,45,10,23,2,1,33};
    HeapSort(a);
    for (int i=0;i<a.size();i++)
        cout << a[i] << " ";
    return 0;
}
posted @ 2022-03-03 22:38  fengzlj  阅读(26)  评论(0)    收藏  举报