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

相关文章

  • Spring Boot中使用Spring-data-jpa的配置方法详解

    Spring Boot中使用Spring-data-jpa的配置方法详解

    今天小编就为大家分享一篇关于Spring Boot中使用Spring-data-jpa的配置方法详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Java整合mybatis实现过滤数据

    Java整合mybatis实现过滤数据

    这篇文章主要介绍了Java整合mybatis实现过滤数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • Java操作Mysql的方法

    Java操作Mysql的方法

    这篇文章主要介绍了Java操作Mysql的方法,实例分析了Java针对有返回结果和没有返回结果的sql操作的相关技巧,需要的朋友可以参考下
    2015-02-02
  • spring Cloud微服务跨域实现步骤

    spring Cloud微服务跨域实现步骤

    这篇文章主要介绍了spring Cloud微服务跨域实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 在Java中判断两个Long对象是否相等

    在Java中判断两个Long对象是否相等

    这篇文章主要介绍了在Java中判断两个Long对象是否相等的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java 读取文件路径空格、

    java 读取文件路径空格、"+"和中文的处理方法

    今天小编就为大家分享一篇java 读取文件路径空格、"+"和中文的处理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • java8 stream sort自定义复杂排序案例

    java8 stream sort自定义复杂排序案例

    这篇文章主要介绍了java8 stream sort自定义复杂排序案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • idea无法打断点,单击或双击代码行左侧区域无效的解决

    idea无法打断点,单击或双击代码行左侧区域无效的解决

    这篇文章主要介绍了idea无法打断点,单击或双击代码行左侧区域无效的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 关于mybatis if else if 条件判断SQL片段表达式取值和拼接问题

    关于mybatis if else if 条件判断SQL片段表达式取值和拼接问题

    这篇文章主要介绍了mybatis if else if 条件判断SQL片段表达式取值和拼接,文章通过自己真实使用的例子给大家详细介绍,需要的朋友可以参考下
    2021-09-09
  • SpringBoot中使用多线程的方法示例

    SpringBoot中使用多线程的方法示例

    这篇文章主要介绍了SpringBoot中使用多线程的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论