• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

风子sama

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

排序算法之堆排序

堆排序

堆排序是排序算法中的一种,这里的堆是指的二叉堆,顾名思义,二叉堆是完全二叉树或者近似完全二叉树,时间复杂度稳定在O(nlog2n)

堆的性质

  1. 堆是一颗完全二叉树
  2. 每个节点的值都大于或者小于其子节点的值,大于为最大堆;小于为最小堆

用堆做排序,就需要把数组转换成堆,

首先创建堆

然后再排序

堆排序的时间复杂度为O(nlog2n)

上代码:

public HeapSort{
    public static void main(String[] args){
        int[] nums = {3,2,1,5,6,4};
        HeapSort(nums);
        
    }
   	static void HeapSort(int[] nums){
        //第一步,先建立堆
        BuildHeap(nums);
        //从堆的末尾取出最小值,放到数组的前面,然后继续调整堆,又出现新的最大堆
        //利用循环可以求得顺序数组
        for(int i=arr.length-1;i>=1;i--){
            int t = arr[i];
            arr[i]=arr[0];
            arr[0]=t;
            Heapify(arr,0,i-1);
        }
    }
    //开始堆排序
    void BuildHeap(int[] nums){
        for(int i = nums.length/2-1;i>=0;i--){
            Heapify(nums,i,nums.length-1);
        }
    }
    //建立堆的时候需要调整堆
    staic void Heapify(int[] nums, int index, int len){
        //找到左右
        int leftson = (index<<1)+1;
        int rightson = (index<<1)+2;
        int temp=0;
        if(leftson<=len && right<=len){
            //求左右孩子节点中较大的
            temp = nums[leftson] > nums[rightson] ? leftson:rightson;
        }
        else if(leftson<=len){
            temp = leftson;
        }
        else if(rightson<=len){
            temp = rightson;
        }
        else return;
        
        if(nums[index] < nums[temp]){
            int t = nums[index];
            nums[index] = nums[temp];
            nums[temp] = t;
            Heapify(nums,temp,len);
        }
    }
}

posted on 2021-09-29 10:37  风子sama  阅读(40)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3