Java快速排序及求数组中第k小的值解析

 更新时间:2023年11月14日 09:20:39   作者:哇哈哈水有点甜  
这篇文章主要介绍了Java快速排序及求数组中第k小的值解析,选一个中间值,把数组中比它小的元素放到左边,比它大的元素放到右边,这时形成三个子数组,分别是中间值,比它大的数和比它小的数,然后对前后两个数组进行递归,需要的朋友可以参考下

快速排序

假设有一个如下数组,对其进行快速排序

[2,90,4,67,234,1,87]

思路:选一个中间值,把数组中比它小的元素放到左边,比它大的元素放到右边,这时形成三个子数组,分别是中间值,比它大的数和比它小的数,然后对前后两个数组进行递归

最好时间复杂度:O(NlogN)

最差时间复杂度:O(N^2)

代码实现(java)

采用哨兵的概念,设数组最后一个元素为哨兵

public static void quickSort(int[] arr,int begin,int end){
    //递归必须满足条件:起始值小于终止值
    if(begin<end){
        //这个方法是确定数组哨兵在排序后的最终位置下标,由于哨兵左边的数都小于哨兵,右边的数都大于哨兵,所以对两边子数组进行递归
        int index = partition(arr,begin,end);
        //对左边的子数组进行递归 
        quickSort(arr,begin,index-1);
        //对右边的数组进行递归
        quickSort(arr,index+1,end);
    }
}
public static int partition(int[] arr,int begin,int end){
    //将数组的最后一个元素作为哨兵
    int pivot = arr[end];
    //i为起始坐标-1
    int i = begin -1;
    //对数组进行遍历,j从数组的第一个下标开始,当j对应元素小于哨兵时,i加1,交换i和j对应元素
    for (int j = begin; j < end; j++) {
        //当
        if(arr[j]<=pivot){
            i++;
          int tmp = arr[i];
          arr[i]=arr[j];
          arr[j]=tmp;
        }
    }
    //遍历结束后,交换arr[i+1]和哨兵的值
    int tmp = arr[i+1];
    arr[i+1]=arr[end]; 
    arr[end]= tmp;
    //i+1就是哨兵最终排序后对应的下标
    return i+1;
}

过程演示:

在这里插入图片描述

求数组中第k小的值

分析:第k小的值,就是下标为k-1的值

代码实现(java)

public static int quickSortKMin(int[] arr,int begin,int end,int k){
    //递归必须满足条件:起始值小于等于终止值
    if(begin<=end){
        //这个方法是确定数组哨兵在排序后的最终位置下标,由于哨兵左边的数都小于哨兵,右边的数都大于哨兵,所以对两边子数组进行递归
        int index = partition(arr,begin,end);
        //如果哨兵的下标就等于k-1,那哨兵就是数组中第k小的值,直接输出
        if(index==k-1){
            return arr[index];
        }else if(index > k-1){
            //如果k-1小于哨兵的下标,说明在哨兵左侧,递归查找即可
            return quickSortKMin(arr,begin,index-1,k);
        }else{
            //如果k-1大于哨兵的下标,说明在哨兵右侧,递归查找即可
            return quickSortKMin(arr,index+1,end,k);
        }
    }
    return Integer.MIN_VALUE;
}


public static int partition(int[] arr,int begin,int end){
    //将数组的最后一个元素作为哨兵
    int pivot = arr[end];
    //i为起始坐标-1
    int i = begin -1;
    //对数组进行遍历,j从数组的第一个下标开始,当j对应元素小于哨兵时,i加1,交换i和j对应元素
    for (int j = begin; j < end; j++) {
        //当
        if(arr[j]<=pivot){
            i++;
          int tmp = arr[i];
          arr[i]=arr[j];
          arr[j]=tmp;
        }
    }
    //遍历结束后,交换arr[i+1]和哨兵的值
    int tmp = arr[i+1];
    arr[i+1]=arr[end];
    arr[end]= tmp;
    //i+1就是哨兵最终排序后对应的下标
    return i+1;
}

到此这篇关于Java快速排序及求数组中第k小的值解析的文章就介绍到这了,更多相关Java快速排序及求数组值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java使用条件语句和循环结构确定控制流(实例)

    Java使用条件语句和循环结构确定控制流(实例)

    下面小编就为大家带来一篇Java使用条件语句和循环结构确定控制流(实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 使用SpringSecurity 进行自定义Token校验

    使用SpringSecurity 进行自定义Token校验

    这篇文章主要介绍了使用SpringSecurity 进行自定义Token校验操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Springboot启动流程详细分析

    Springboot启动流程详细分析

    这篇文章主要介绍了SpringBoot启动过程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-12-12
  • Java8中的lambda表达式入门教程

    Java8中的lambda表达式入门教程

    lambda表达式,即带有参数的表达式,为了更清晰地理解lambda表达式,下面通过示例代码给大家介绍java8 lambda 表达式入门教程,感兴趣的朋友一起看看吧
    2017-08-08
  • 浅谈java中HashMap键的比较方式

    浅谈java中HashMap键的比较方式

    今天带大家了解一下java中HashMap键的比较方式,文中有非常详细的解释说明及代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • 基于java实现DFA算法代码实例

    基于java实现DFA算法代码实例

    这篇文章主要介绍了基于java实现DFA算法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 基于SpringAI+DeepSeek实现流式对话功能

    基于SpringAI+DeepSeek实现流式对话功能

    一般来说大模型的响应速度通常是很慢的,为了避免用户用户能够耐心等待输出的结果,我们通常会使用流式输出一点点将结果输出给用户,那么问题来了,想要实现流式结果输出,后端和前端要如何配合?下来本文给出具体的实现代码,需要的朋友可以参考下
    2025-02-02
  • Java网络编程之简单的服务端客户端应用实例

    Java网络编程之简单的服务端客户端应用实例

    这篇文章主要介绍了Java网络编程之简单的服务端客户端应用,以实例形式较为详细的分析了java网络编程的原理与服务器端客户端的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • Java小程序求圆的周长和面积实例

    Java小程序求圆的周长和面积实例

    这篇文章主要介绍了首先用蒙塔卡洛算法求圆周率近似值,然后根据此近似值输出圆的周长和面积,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • IntelliJ IDEA 构建maven多模块工程项目(详细多图)

    IntelliJ IDEA 构建maven多模块工程项目(详细多图)

    这篇文章主要介绍了IntelliJ IDEA 构建maven多模块工程项目(详细多图),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06

最新评论