heapsort

#include<bits/stdc++.h>
using namespace std;
#define swap1(a,b) do{int c=a, a =b, b =c}while(0)

//将k为根的子树调整为大根堆
void HeadAdjust(int a[], int k, int len) {
    a[0] = a[k];//a[0] 是暂存位
    for (int i = 2 * k; i <= len; i *= 2) {//i *=2 是把i变成他的左孩子下面判断若i>len则说明没有左孩子
        if (i < len && a[i] < a[i + 1]) i++;//若左孩子<右孩子则指向右孩子,否则指的是左孩子,选最大的孩子向下筛选
        if (a[0] >= a[i]) break;//结点小于根则不管
        else {
            a[k] = a[i]; k = i;//找到比根大的节点 放到根上,并且重置‘指针’
        }
    }
    a[k] = a[0];
}

void BuildMaxHeap(int a[], int len) {
    for (int i = len / 2; i > 0; i--)
        HeadAdjust(a, i, len);
}


void HeapSort(int a[], int len) {
    BuildMaxHeap(a, len);
    for (int i = len; i > 1; i--) {
        swap(a[i], a[1]);
        HeadAdjust(a, 1, i - 1);

    }
}

int main() {
    int a[] = { 0,5,9,8,6,4,3,1,7,4 };
    HeapSort(a, 9);
    for (int i = 1; i < 10; i++) {//a[0]是暂存位
        cout << a[i] << " ";
    }
}

 

posted @ 2022-03-22 12:24  Dsad123FFFG6645  阅读(33)  评论(0)    收藏  举报