技术

堆排序

堆排序笔记

堆排序

#include <stdio.h>

void heapify (int tree[], int n, int i){
    if (i >= n) {
        return;
    }
    int max = i;
    int c1 = 2*i + 1;
    int c2 = 2*i + 2;
    if (c1 < n && tree[c1] > tree[max]) {
        max = c1;
    } 
    if (c2 < n && tree[c2] > tree[max]) {
        max = c2;
    }
    if (max != i) {
        swap(tree, max, i);
        heapify(tree, n, max);
    } 
}    

void build_heap (int tree[], int n) {
    int last_node = n - 1;
    int parent = (last_node-1)/2;
    int i;
    for (i = parent; i >= 0; i--) {
        heapify(tree, n, i);
    }
}

void heap_sort (int tree[], int n) {
    build_heap(tree,n);
    int i;
    for (i = n-1; i >= 0; i--) {
        swap(tree, i, 0);
        heapify(tree, i, 0);
    }
}

int main() {
    int tree[] = {10,6,5,4,1,3};
    int n = 6;
    // heapify(tree, n, 0);
    // build_heap(tree, n);
    // heap_sort(tree, n);
    int i;
    for (i = 0; i < n; i++) {
        printf(“%d\n”,tree[i]);
    }
    return 0;
}