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快速排序及求数组值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Feign动态设置header和原理分析

    使用Feign动态设置header和原理分析

    这篇文章主要介绍了使用Feign动态设置header和原理分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • spring整合redis以及使用RedisTemplate的方法

    spring整合redis以及使用RedisTemplate的方法

    本篇文章主要介绍了spring整合redis以及使用RedisTemplate的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • 初识Java一些常见的数据类型

    初识Java一些常见的数据类型

    这篇文章主要介绍Java一些常见的数据类型,Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义,下面文章小编就来简单介绍为什么说Java是最好的语言并且介绍它的各种常见类型,需要的朋友可以参考一下
    2021-10-10
  • SpringBoot项目使用协同过滤的实现

    SpringBoot项目使用协同过滤的实现

    协同过滤是一种常用的推荐系统算法,用于预测用户可能喜欢的物品,本文主要介绍了SpringBoot项目使用协同过滤的实现,感兴趣的可以了解一下
    2023-09-09
  • IDEA怎么设置maven配置

    IDEA怎么设置maven配置

    这篇文章主要介绍了IDEA怎么设置maven配置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Spring Cloud Gateway网关XSS过滤方式

    Spring Cloud Gateway网关XSS过滤方式

    这篇文章主要介绍了Spring Cloud Gateway网关XSS过滤方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • dubbo集成zipkin获取Traceid的实现

    dubbo集成zipkin获取Traceid的实现

    这篇文章主要介绍了dubbo集成zipkin获取Traceid的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 一篇文章看懂Java异常处理

    一篇文章看懂Java异常处理

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的,这篇文章主要给大家介绍了关于Java异常处理的相关资料,需要的朋友可以参考下
    2021-11-11
  • Java实现文件上传到服务器本地并通过url访问的方法步骤

    Java实现文件上传到服务器本地并通过url访问的方法步骤

    最近项目中使用到了文件上传到服务器的功能,下面这篇文章主要给大家介绍了关于Java实现文件上传到服务器本地并通过url访问的方法步骤,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • 新的Java访问mysql数据库工具类的操作代码

    新的Java访问mysql数据库工具类的操作代码

    本文通过实例代码给大家介绍新的Java访问mysql数据库工具类的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-12-12

最新评论