美文网首页
堆排序算法

堆排序算法

作者: 意浅离殇 | 来源:发表于2017-10-15 21:50 被阅读0次

堆排序 平均时间复杂度为 O(nlogn) 最坏情况下O(nlogn)

原理 (以从小到大为例)

首先将数组中的数据构建大根堆 具体代码如下

    for(i=n/2-1;i>=0;i--){//建成大根堆
        while(2*i+1<n){       //存在左右子树
            j=2*i+1;//左子树
            if((j+1)<n){//右子树存在的情况
                if(a[j]<a[j+1]) j++;//如果右子树比做左子树大      j指向  右子树
            }
            if(a[i]<a[j]){//如果    子节点大于根节点进行交换
                t=a[j];
                a[j]=a[i];
                a[i]=t;
                i=j;//调整子树
            }else{
                break;//不需要调整
            }
        }
    }

构建大根堆结束后下来进行排序 由于是大根对 则根节点就是当前最大值 交换该值重新构造大根堆

重复上述具体代码如下

    for(i=n-1;i>0;i--){//依次遍历
        t=a[0];                //与第i个数据进行交换     将最大值    插入到该在的地方
        a[0]=a[i];
        a[i]=t;
        k=0;
        while(2*k+1<i){//更换根节点后   堆中元素数量减少     重新构造大根堆
            j=2*k+1;//左子树
            if((j+1)<i){//右子树存在的情况
                if(a[j]<a[j+1]) j++;//如果右子树比做左子树大      j指向  右子树
            }
            if(a[k]<a[j]){
                t=a[j];
                a[j]=a[k];
                a[k]=t;
                k=j;//调整子树
            }else{
            
                break;//不需要调整
            }
        
        }
    }

完整代码如下

/*先建成 大根堆 然后每次取a0 的数据此时的数据为最大值 调整堆结构 使最大值依旧在a0 上

  • flag为true 从小到大 false 从大到小
    */
    public class Pile_Sort {

    public void pile_sort(int a[],boolean flag){
    int i=0,j=0,h=0,k=0,t;
    int n=a.length;
    for(i=n/2-1;i>=0;i--){//建成大根堆
    while(2i+1<n){
    j=2
    i+1;//左子树
    if((j+1)<n){//右子树存在的情况
    if(a[j]<a[j+1]) j++;///如果右子树比做左子树大 j指向 右子树
    }
    if(a[i]<a[j]){
    t=a[j];
    a[j]=a[i];
    a[i]=t;
    i=j;//调整子树
    }else{
    break;//不需要调整
    }
    }
    }
    for(i=n-1;i>0;i--){//依次遍历
    t=a[0]; //与第i个数据进行交换
    a[0]=a[i];
    a[i]=t;
    k=0;
    while(2k+1<i){//更换根节点后 堆中元素数量减少
    j=2
    k+1;//左子树
    if((j+1)<i){//右子树存在的情况
    if(a[j]<a[j+1]) j++;///如果右子树比做左子树大 j指向 右子树
    }
    if(a[k]<a[j]){
    t=a[j];
    a[j]=a[k];
    a[k]=t;
    k=j;//调整子树
    }else{

                 break;//不需要调整
             }
         
         }
     }
     if(!flag){//如果flag  为false    则从大到小排序  此时我们交换前后顺序
          n=a.length-1;
         for(i=0;i<a.length/2;i++){
             t=a[i];
             a[i]=a[n-i];
             a[n-i]=t;
         }
     }
    

    }
    }

相关文章

  • iOS算法总结-堆排序

    iOS算法总结-堆排序 iOS算法总结-堆排序

  • 数据结构与算法

    常见排序算法 堆排序 算法大全 算法大汇总

  • 堆排序算法思想

    前两天看了看堆排序算法,啃了半天的书,最后搞明白了堆排序算法,今天有时间给大家说说这个堆排序算法。首先讲一下算法的...

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • 堆排序

    转载:图解排序算法(三)之堆排序 预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选...

  • 常用排序算法之堆排序

    堆排序算法 运行 输出

  • 算法与数据结构(六):堆排序

    title: 算法与数据结构(六):堆排序tags: [算法与数据结构, C语言, 堆排序]date: 2019-...

  • 数据结构

    Q:堆排序 A:1 堆排序算法(图解详细流程)2 堆排序 Q:排序算法时间复杂度与稳定性 选择排序为什么不稳定:举...

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 排序算法(六)堆排序

    排序算法(六 )堆排序 1.算法思路  堆排序(Heap-Sort)是一种基于二叉堆的排序算法。即将一个无序序列构...

网友评论

      本文标题:堆排序算法

      本文链接:https://www.haomeiwen.com/subject/pdhhuxtx.html