堆排序

Posted houzm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序相关的知识,希望对你有一定的参考价值。

堆相关操作

建堆

向下堆化

向上堆化

删除堆顶(向下堆化)

添加元素(向上堆化)

堆排序

建堆(逆序 向下堆化)

排序(向下堆化)

Code

#include <iostream>
using namespace std;
const int maxn=100;
int arr[maxn]= {5,2,6,7,4,3,0,9,8,1};
int len =10;
//向下堆化
void downAjust(int low,int heigh) {
    int i=low,j=low*2+1;
    while(j<=heigh) {
        if(j+1<=heigh&&arr[j]<arr[j+1])j=j+1; //若右子节点存在,并且大于左子节点
        if(arr[i]>arr[j])break;
        else {
            swap(arr[i],arr[j]);
            i=j;
            j=2*i+1;
        }
    }
}
//向上堆化
void upAjust(int low,int high) {
    int i=high,j=(i-1)/2;
    while(j>=low&&i>0) {
        if(arr[i]<arr[j])break;//父节点权值大于子节点权值
        else {
            swap(arr[i],arr[j]);
            i=j;
            j=(i-1)/2;
        }
    }
}
//建堆
void heap() {
    for(int i=(len-1)/2; i>=0; i--)
        downAjust(i,len-1); //向下调整
}
// 堆排序
void heap_sort() {
    for(int i=len-1; i>=1; i--) {
        swap(arr[i],arr[0]); //最后一个节点与堆顶交换
        downAjust(0,i-1); //堆顶向下堆化
    }
}
// 打印堆
void print_heap() {
    for(int i=0; i<len; i++) {
        printf("%d",arr[i]);
        printf("%s",i==len-1?"
":" ");
    }
}
// 插入元素
void insert(int v) {
    arr[len++]=v;
    upAjust(0,len-1);
}
// 删除堆顶
void delete_top(){
    swap(arr[0],arr[--len]);
    downAjust(0,len-1);  
} 
int main(int argc,char *argv[]) {
    heap();
    // 堆排序
//  print_heap();
//  heap_sort();
//  print_heap();


    // 插入元素
//  print_heap();
//  insert(10);
//  print_heap();

    // 删除元素
//  print_heap();
//  delete_top();
//  print_heap();

    return 0;
}

以上是关于堆排序的主要内容,如果未能解决你的问题,请参考以下文章

选择排序(简单选择排序堆排序的算法思想及代码实现)

排序--08---堆排序

python代码实现堆排序

算法-java代码实现堆排序

一文带你了解堆排序

堆排序