一、问题描写叙述

给定一个整数数列,寻找其按递增排序后的第k个位置上的元素。

二、问题分析

借助类似快排思想实现pation函数。再利用递归思想寻找k位置。

三、算法代码

public static int selectMinK(int [] arr, int low, int high, int k){
int index = pation(arr, low, high);
if(index == k){
return arr[index];
}
if(index < k){
return selectMinK(arr, index + 1, high, k);
}else{
return selectMinK(arr, low, index - 1, k);
}
} public static int pation(int [] arr, int low, int high){
while(low < high){
while(low < high && arr[low] <= arr[high]){//从后往前。把小的元素往前调换
high--;
}
if(low < high){
int tmp = arr[low];
arr[low] = arr[high];
arr[high] = tmp;
low++;
}
while(low < high && arr[low] <= arr[high]){//从前往后。把大的元素往后调换
low++;
}
if(low < high){
int tmp = arr[low];
arr[low] = arr[high];
arr[high] = tmp;
high--;
}
}
return low;//返回low。high相遇位置
}

四、完整測试代码

public class Solution {

	public static void main(String [] args){
int [] randArr = new int[]{5,2,8,6,3,6,9,7};
int result = selectMinK(randArr, 0, randArr.length - 1, 4);
System.out.print(result);
}
public static int selectMinK(int [] arr, int low, int high, int k){
int index = pation(arr, low, high);
if(index == k){ //若返回的下标为k,则找到目标元素
return arr[index];
}
if(index < k){
return selectMinK(arr, index + 1, high, k);
}else{
return selectMinK(arr, low, index - 1, k);
}
} public static int pation(int [] arr, int low, int high){
while(low < high){
while(low < high && arr[low] <= arr[high]){
high--;
}
if(low < high){
int tmp = arr[low];
arr[low] = arr[high];
arr[high] = tmp;
low++;
}
while(low < high && arr[low] <= arr[high]){
low++;
}
if(low < high){
int tmp = arr[low];
arr[low] = arr[high];
arr[high] = tmp;
high--;
}
}
return low;
}
}

五、执行结果

第4小元素为:6

减治算法之寻找第K小元素问题的更多相关文章

  1. 寻找第K小元素

    要在一个序列里找出第K小元素,可以用排序算法,然后再找.可以证明,排序算法的上界为O(nlogn). 在这里,给出两种可以在线性时间内找出第K小元素的方法. 方法1: (1) 选定一个比较小的阈值(如 ...

  2. 算法导论 寻找第i小元素 9.2

    PS1:如果单纯为做出这道题那么这个代价是O(nlgn),通过排序就可以了. 这里讨论的是O(n)的算法.那么来分析一下这个算法是如何做到O(n)的,算了不分析了,这个推到看起来太麻烦了.其实我想知道 ...

  3. 快速选择算法/Select 寻找第k大的数

    参考算法导论9.3节的内容和这位大神的博客:http://blog.csdn.net/v_JULY_v上对这一节内容代码的实现进行了学习 尝试实现了以查找中位数为前提的select算法. 算法功能:可 ...

  4. 快速排序以及第k小元素的线性选择算法

    简要介绍下快速排序的思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此 ...

  5. 算法导论学习之线性时间求第k小元素+堆思想求前k大元素

    对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...

  6. (寻找第K小的数&amp;&amp;寻找第K小的数的和)

    这一篇博客以一些OJ上的题目为载体,讲一下寻找第K小的数的方法 方法一: 先将数据排列好,然后,然后return a[k]或者将前K个数加起来 方法二: 基于高速排序.如,一次高速排序将某一个数放到了 ...

  7. 中位数与第K小元素

    算法实际上是模仿快速排序算法设计出来的,其基本思想也是对输入数组进行递归划分,与快速排序不同的是,它只对划分出来的子数组之一进行递归处理: int randompartition(int a[],in ...

  8. 清橙OJ 1082 查找第K小元素 -- 快速排序

    题目地址:http://oj.tsinsen.com/A1082 问题描述 给定一个大小为n的数组s和一个整数K,请找出数组中的第K小元素. 这是一个补充程序的试题,你需要完成一个函数: int fi ...

  9. 查询无序列表中第K小元素

    当需要在无需列表中寻找第k小的元素时,一个显然的方法是将所有数据进行排序,然后检索k个元素.这种方法的运行时间为O(n log(n)). 无序列表调用分区函数将自身分解成两个子表,其长度为i和n-i. ...

随机推荐

  1. 树莓派 Centos7 安装EPEL 7

    cat > /etc/yum.repos.d/epel.repo << EOF [epel] name=Epel rebuild for armhfp baseurl=https:/ ...

  2. cenos6.5作为网关

    入口服务器(网关服务器)关闭selinuxsetenforce 0vim /etc/selinux/config将SELINUX=enforcing改为SELINUX=disabled 修改防火墙ip ...

  3. LeetCode(101)Symmetric Tree

    题目 Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). Fo ...

  4. SQL练习题笔记

    查找最晚入职员工的所有信息 select * from employees order by hire_date desc limit 1 查找入职员工时间排名倒数第三的员工所有信息 select * ...

  5. 如何将表的行数赋值给变量(MySQL)

    delimiter $$ drop procedure if exists test_at $$ create definer=root@localhost procedure test_at() b ...

  6. Linux Bash对拍

    代码: #!/bin/bash while true; do ./rand > input //数据生成器 ./test < input > output //测试程序 ./std ...

  7. POJ 1236 学校网络间的强连通

    题目大意: N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输.问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件.问题2:至少需要添加几条 ...

  8. hdu 4422

    #include<stdio.h> #include<string.h> #define inf  0x7fffffff int main() {     int i,j,k, ...

  9. html5的新通讯技术socket.io,实现一个聊天室

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. css三大布局

    标准流: 从左到右,从上到下块级元素独占一行,行内元素碰到父盒子边缘换行 浮动: 特点 1 元素浮动之后不占据原来的位置(脱标),变成立体,下面可以有东西,只影响下面的 2 浮动的盒子在一行上显示 3 ...