堆排序

重新理解了一下堆排序,明白了从小到大排序为什么建立最大堆,以及交换的意义

mark代码,以后复习

#include 
using namespace std;
#define maxn 10000
#define inf 0x3f3f3f3f
#define met(a, b) memset(a, b, sizeof(a))
void maxHeapFinxDown(int a[], int i, int n);
void heapSort(int a[], int n);
int a[maxn];
int main(){
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        scanf("%d", &a[i]);
    }
    heapSort(a, n);
    for(int i = 0; i < n; i++) printf("%d ",a[i]);
    return 0;
}
void maxHeapFinxDown(int a[], int i, int n){
    int j = 2 * i + 1;
    int tmp = a[i];
    while(j < n){
        if(j + 1 < n && a[j] < a[j + 1]){
            j++;
        }
        if(tmp > a[j]) break;
        else{
            a[i] = a[j];
            i = j;
            j = 2 * i + 1;
        }
    }
    a[i] = tmp;
}
void heapSort(int a[], int n){
    for(int i = n / 2 - 1; i >= 0; i--){
        maxHeapFinxDown(a, i, n);//从最后一个非叶子节点开始调整为最大堆堆化数组
    }
    for(int i = n - 1; i >= 1; i--){
        swap(a[i], a[0]);//把最大的元素挪到最后面
        maxHeapFinxDown(a, 0, i)//调整前i个元素
    }
}

你可能感兴趣的:(数据结构)