zoukankan      html  css  js  c++  java
  • 堆排序

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

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

    代码主要分为三个核心操作: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里面稍作修改就能用,果然是不依赖于具体的实现语言啊~~

  • 相关阅读:
    Ubuntu安装php7.0环境
    PHP-FPM参数详情
    phpize是干嘛的
    Ubuntu忘记密码
    Ubuntu下面删除和卸载软件
    Js验证正则表达式
    JS发送验证码;并设置cookie
    Shell脚本之sed的使用
    Bash基本功能:输入输出重定向
    shell常用快捷键
  • 原文地址:https://www.cnblogs.com/yinhao-ing/p/10594210.html
Copyright © 2011-2022 走看看