堆排序算法

来源:互联网 发布:共享网络怎么连接 编辑:程序博客网 时间:2024/06/05 02:23
堆排序  平均时间复杂度为  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(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;//不需要调整
                }
            
            }
        }
        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;
            }
        }
    }
}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝店铺访客数据下滑怎么办 2个ctrl键都失灵怎么办 淘宝上搜索不到很久以前订单怎么办 关键词找不到了是不是被降权怎么办 购买小程序关键词想退款怎么办? 浏览器审查元素不拆分关键词怎么办 拼多多商品想重新编辑怎么办 新开店铺没有销量怎么办 新开的店铺没有销量怎么办 淘宝的商品权重下降是怎么办 360n5手机耗电快怎么办 怪兽充电宝丢了怎么办 有已处置的评价怎么办 淘宝降权了怎么办2018 使用虚假广告词被工商查到怎么办 为什么手机淘宝店关注不了怎么办 淘宝买东西付钱后卖家不发货怎么办 微信销售群没人买东西怎么办 淘宝想开2个店铺怎么办 拼多多没钱交保证金怎么办 差评一个月后怎么办 淘宝买家投诉成立后怎么办 天猫投诉成立了怎么办 新开实体店铺没生意怎么办 新开淘宝没流量怎么办 白色板鞋有青草弄的绿色怎么办 淘宝租衣服不退押金怎么办 c盘不可以扩展怎么办 实践教学管理平台忘记账号怎么办 淘宝申请售后店家不处理怎么办 全民k歌地区限制怎么办 网络电视hdp无法下载怎么办 淘宝店铺销量为零怎么办 快递号填错卖家拒绝退款申请怎么办 淘宝店代购 售假怎么办 淘宝申请售后卖家没钱怎么办 淘宝禁止评价一个月怎么办 被卖家电话骚扰怎么办 恶意骚扰扣12分怎么办 新店开张交保证金被骗了怎么办 支付宝蚂蚁花呗逾期怎么办