Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 数组

    • 搜索

    • 二分查找

    • 排序

      • 215.数组中的第K个最大元素(堆排,快排)
      • 88.合并两个有序数组
      • 179.最大数
      • 912. 归并排序
      • 1090. 受标签影响的最大值
      • 1439. 有序矩阵中的第 k 个最小数组和
      • 347. 前 K 个高频元素
      • 621. 任务调度器
      • 406. 根据身高重建队列
      • 2475. 数组中不等三元组的数目
      • 31. 下一个排列
      • 6929. 数组的最大美丽值
      • 2736. 最大和查询
      • 剑指 Offer 40. 最小的k个数
      • 剑指 Offer 45. 把数组排成最小的数
      • 剑指 Offer 51. 数组中的逆序对
    • 边界判断

    • 双指针法

    • 连续子数组

    • 差分数组

    • 模拟

    • 区间问题

  • 链表

  • 字符串

  • 二叉树

  • 动态规划

  • 深搜回溯

  • 数学贪心

  • 堆栈队列

  • 前缀和

  • 算法设计

  • 位运算

  • WA

  • 算法
  • 数组
  • 排序
phan
2023-05-16

215.数组中的第K个最大元素(堆排,快排)

# 215.数组中的第K个最大元素(堆排,快排)

给定整数数组 nums 和整数 k,请返回数组中第 k个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4

  1. 快排。唯一要注意的地方就是退出函数的条件,当待排序数组只有一个元素(k=1),那么结果就是它。这里没有考虑剪枝,即当前这一轮排序后确定的位置如果正好是第k个大的数字,则可以直接退出返回,不必进行到只剩一个元素待排序数组的情况。
public int quicksort(int[] nums,int low,int high,int k)
    {
        //if(low>=high)
        //return ;
        if(low==high)
        return nums[high];
        int base=nums[low];
        int left=low,right=high;
        while(low<high)
        {
            while(low<high&&nums[high]>=base)
            high--;
            while(low<high&&nums[low]<=base)
            low++;
            if(low<high)
            {
                int temp=nums[high];
                nums[high]=nums[low];
                nums[low]=temp;
            }
        }//这里循环出来必定有low=high
        nums[left]=nums[high];
        nums[high]=base;
        //quicksort(nums,left,low-1);
        //quicksort(nums,high+1,right);
        if(right-high>=k)
        return quicksort(nums,high+1,right,k);
        else
        return quicksort(nums,left,high,k-(right-high));

    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  1. 堆排序。整个堆排序巧妙的地方在于,大根堆的排序和每轮排序后结果(堆顶元素)都是保存在一个数组中。排序过程中堆空间变小,排序后的有序数组空间变大。因此自顶向下调整堆时,maxHeapify()的形参中要包含当前所要调整的堆的大小。其它要考虑清楚的就以下几点:
  • 顺序存储的二叉树左孩子和右孩子表示方式。
  • 堆调整时左孩子或者右孩子越界的限制条件。
  • 初始堆时从哪个位置开始调整。
    public int findKthLargest(int[] nums, int k) {
       buildMaxHeap(nums);
       int heapsize=nums.length;
       for(int i=0;i<k;i++)
       {
           swap(nums,0,nums.length-1-i);
           heapsize--;    //排序完一轮堆大小减1
           maxHeapif(nums,0,heapsize);
       }
       return nums[nums.length-k];     
    }
    public void buildMaxHeap(int[] nums) //初始堆
    {
        for(int i=(nums.length-1)/2;i>=0;i--)
            maxHeapif(nums,i,nums.length);
    }
    public void maxHeapif(int[] nums,int target,int heapsize)
    {
        int left=target*2+1,right=target*2+2,max=target;
        if(left<heapsize&&nums[max]<nums[left])
        max=left;
        if(right<heapsize&&nums[max]<nums[right])
        max=right;
        if(max==target) //满足堆定义返回
        return;
        swap(nums,target,max);
        maxHeapif(nums,max,heapsize);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
编辑 (opens new window)
#Leetcode#排序
上次更新: 2023/12/15, 15:49:57
410. 分割数组的最大值
88.合并两个有序数组

← 410. 分割数组的最大值 88.合并两个有序数组→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式