堆排序

堆排序的基本思想:将给定的数组转化成堆,然后将根节点与尾节点互换,将得到的树再次堆化,循环往复直到完成排序。

堆的性质:首先,堆是个完全二叉树,因此可以用一位数组表示;其次,对于堆中的每一个节点,它总是大于自己的孩子节点。

代码主要分为三个核心操作:1 对单个节点堆化;2 将整个数组堆化;3 将堆化的数组排序。

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

void heapify(int tree[],int size,int k);//将下标为k的节点进行heapify 
void swap(int arr[],int a,int b);//交换arr[a]和arr[b]的值 
void buildHeap(int tree[],int size);//建立max heap 
void heapSort(int tree[],int size);//堆排序,从小到大 

int main(void)
{
    int arr[]={4,10,8,1,5,12,6,7,0,3,2,15,18};
    int size=13;
    heapSort(arr,size);
    for(int i=0;i<size;i++)
         printf("%d ",arr[i]);
    return 0;
}

void heapSort(int tree[],int size)
{
    buildHeap(tree,size);
    for(int i=size-1;i>=0;i--){
        swap(tree,i,0);
        heapify(tree,i,0);
    }
}

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

void heapify(int tree[],int size,int k)
{
    if(k>=size) return;//递归边界 
    int Lc=2*k+1,Lr=2*k+2;//Lc和Lr分别为k节点的左右孩子
    int max=k;//假定k节点的值相对于孩子来说最大 
    if(Lc<size&&tree[Lc]>tree[max])
        max=Lc;
    if(Lr<size&&tree[Lr]>tree[max])
        max=Lr;
    if(max!=k){
        swap(tree,max,k);
        heapify(tree,size,max);
    }
}

void swap(int arr[],int a,int b)
{
    int tmp;
    tmp=arr[a];
    arr[a]=arr[b];
    arr[b]=tmp;
}

堆排序的超详细讲解见https://www.bilibili.com/video/av47196993

我把代码粘贴到eclipse里面稍作修改就能用,果然是不依赖于具体的实现语言啊~~

原文地址:https://www.cnblogs.com/yinhao-ing/p/10594210.html