选择排序—堆排序

堆排序:
如果把待排序的数据元素集合构成一个完全二叉树的结构,则每次选出一个最大(最小)的数据元素,只需比较完全二叉树的数值为高度的次数,即log2n次,所以算法的复杂度就为O(log2n)。
堆的定义
最小堆:
这里写图片描述

保持每个节点比它的左右孩子都小;
根节点是堆中值最小的数据元素;
根节点到每个叶子节点的路径上都是递增有序的

最大堆:
这里写图片描述

保持每个节点比它的左右孩子都大;
根节点是堆中值最大的数据元素;
根节点到每个叶子节点的路径上都是递增有序的。

1.创建堆:(手画,勿嫌弃)
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

2.排序:
(1)堆顶a[0]元素与当前最大堆的最后一个元素交换
(2)最大堆个数减一
(3)调整堆,使之满足最大堆

public class S{ 
//调整堆   
    public void CreatHeap(int a[],int n,int h)
    {
        int i=h;
        int j=2*i+1;
        int flag=0;
        int temp=a[i];
        while (j<n  &&  flag!=1) 
        {
            if(j<n-1  &&  a[j]<a[j+1])
            {
                j++;
            }
            if(temp>a[j])
            {
                flag=1;
            }
            else{
                a[i]=a[j];
                i=j;
                j=2*i+1;
            }
        }
        a[i]=temp;      
    }
    //创建堆
    public void initCreatHeap(int a[],int n)
    {
        for(int i=(n-1)/2;i>=0;i--)
        {
            CreatHeap(a, n,i);
        }       
    }
    //排序
    public void HeapSort(int []a,int n)
    {
         initCreatHeap(a, n);
         int x=0;
         for(int i=n-1;i>0;i--)
         {
             x++;
             int temp=a[0];
             a[0]=a[i];
             a[i]=temp;
             CreatHeap(a, i, 0);
             System.out.print("第"+x+"次排序:"+" ");
             for(int j=0;j<a.length;j++)
            {
                System.out.print(a[j]+" ");
            }
             System.out.println();
         }
    }
    public static void main(String [] args) 
      {
        int []arr={10,50,40,88,76,9,32,5};
        int n=arr.length;
        S s=new S();
        System.out.print("最初:"+" ");
        for(int i=0;i<arr.length;i++)
        {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
        s.HeapSort(arr, n);
        System.out.print("最终排序:"+" ");
        for(int i=0;i<arr.length;i++)
        {
            System.out.print(arr[i]+" ");
        }
      }
}

这里写图片描述

最好=最坏=O(n log2n)
不稳定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值